이런거 저런거 그런거

조도센서값을 도트 매트릭스에 표시하기 본문

이것저것 해보기/아두이노 가지고 놀기

조도센서값을 도트 매트릭스에 표시하기

빵진 2019. 9. 22. 23:27

그냥 숫자,문자 표시하기엔 심심한 것 같아 빵판 살 때 배송비가 아까워서 추가로 같이 샀던 조도 센서 값을 표시해 보기로 했다.

 

"[YwRobot] 아두이노 조도센서 모듈 [SEN030101]"

SEN030101

 

이 부품을 아래와 같이 연결하고 조도센서값을 analogRead()로 읽은 값을 표시해보았다.

아두이노 & 도트매트릭스 & 조도센서 연결

 

도트 매트릭스에 나름 표시 할 수 있는 숫자가 00 ~ 99 이므로

읽은 값을 10으로 나눈 값으로 표시하기로 했다.

 

사전에 도트매트릭스에 표시 할 숫자 0 ~ 9 패턴 9개는 미리 만들어놓고

들어온 입력에 대해 적당한 위치(십의자리, 일의자리)에 해당 패턴을 써주는 방법으로...

#define MAX7219_CLK (10)
#define MAX7219_CS  (11)
#define MAX7219_DIN (12)

/*
 * LED Matrix
 */
#define DECODE_MODE_ADDR  (0x09)
#define DECODE_MODE_VAL   (0x00)
#define INTENSITY_ADDR    (0x0A) //Bright Setting (0x00 ~ 0x0F)
#define INTENSITY_VAL     (0x00)
#define SCAN_LIMIT_ADDR   (0x0B) //How many use digit led (line count in matrix led device)
#define SCAN_LIMIT_VAL    (0x07)
#define POWER_DOWN_MODE_ADDR  (0x0C)
#define POWER_DOWN_MODE_VAR   (0x01)
#define TEST_DISPLAY_ADDR (0x0F)
#define TEST_DISPLAY_VAL  (0x00)

/* LED Pattern */
const char NUMBER[10][3] = {
    {0x1f, 0x11, 0x1f}, //0
    {0x00, 0x00, 0x1f}, //1
    {0x1d, 0x15, 0x17}, //2
    {0x15, 0x15, 0x1f}, //3
    {0x07, 0x04, 0x1f}, //4
    {0x17, 0x15, 0x1d}, //5
    {0x1f, 0x15, 0x1d}, //6
    {0x03, 0x01, 0x1f}, //7
    {0x1f, 0x15, 0x1f}, //8
    {0x17, 0x15, 0x1f}  //9
  };

void write_to_max7219(uint8_t addr, uint8_t value)
{
  digitalWrite(MAX7219_CS, LOW);  //ChipSelect to LOW
  shiftOut(MAX7219_DIN, MAX7219_CLK, MSBFIRST, addr);
  shiftOut(MAX7219_DIN, MAX7219_CLK, MSBFIRST, value);
  digitalWrite(MAX7219_CS, HIGH); //ChipSelect to HIGH
}

void init_max7219(void)
{
  pinMode(MAX7219_CLK, OUTPUT);
  pinMode(MAX7219_CS, OUTPUT);
  pinMode(MAX7219_DIN, OUTPUT);

  //settings
  write_to_max7219(DECODE_MODE_ADDR, DECODE_MODE_VAL);
  write_to_max7219(INTENSITY_ADDR, INTENSITY_VAL);
  write_to_max7219(SCAN_LIMIT_ADDR, SCAN_LIMIT_VAL);
  write_to_max7219(POWER_DOWN_MODE_ADDR, POWER_DOWN_MODE_VAR);
  write_to_max7219(TEST_DISPLAY_ADDR, TEST_DISPLAY_VAL);
}

/*
 * Light Sensor
 */
#define LIGHT_SENSOR_PIN (0)
void init_light_sensor(void)
{
  /* Do Nothing */
}

int read_light_sensor(void)
{
  return analogRead(LIGHT_SENSOR_PIN);
}

/*
 * Functions
 */
void setup()
{
  Serial.begin(115200);
  init_max7219();
  init_light_sensor();
}

void loop()
{
  int light_sensor_value;
  unsigned int i;
  unsigned char display_data[8] = {0,};

  light_sensor_value = read_light_sensor() / 10;
  memcpy(&(display_data[5]), NUMBER[light_sensor_value % 10], 3);
  memcpy(&(display_data[1]), NUMBER[((light_sensor_value % 100) / 10)], 3);
  for (i = 0; i < 8; i++) {
    write_to_max7219(i+1, display_data[i]);
  }
  delay(500);
  Serial.println(read_light_sensor());
}

 

 

완성~~

 

다음엔 뭘 해볼까나...

Comments