질문게시판 > eeprom 값 출력이 다르게 나옵니다

인기검색어 > 아두이노 센서 ATMEGA128

최신글 질문게시판 동영상강좌 가입하기

▼ BASIC4MCU 후원업체 신제품 정보 ▼

▲ BASIC4MCU 후원업체 신제품 정보 ▲

BASIC4MCU > 질문게시판

eeprom 값 출력이 다르게 나옵니다

페이지 정보

작성자 idghte 작성일24-05-05 05:38 조회371회 댓글5건

본문

혼자서 아두이노 공부중인 학생입니다. eeprom을 공부중인데 문제가 생겼습니다.

스위치는 총 3개이고, 전원을 켠 후 1번→1번→2번 순서로 눌렀을 시 온도, 밝기가 lcd에 출력됩니다.

여기서 3번 스위치를 누르면 eeprom에 저장하고, 재부팅 후 3번스위치를 누르면 값이 그대로 lcd에 출력되어야하는데 

온도는 잘 나오는 듯 한데 밝기가 너무 낮게 나옵니다. 도와주시면 감사하겠습니다 ㅜㅜ (혹시몰라서 회로사진 첨부하겠습니다) 

 

#include <LiquidCrystal_I2C.h>

#include <Wire.h>

#include <EEPROM.h>

LiquidCrystal_I2C lcd(0x27,16,2);

 

const int sw1 = 10;

const int sw2 = 9;

const int sw3 = 8;

int s_state1 = 0;

int s_state2 = 0;

int s_state3 = 0;

int sw_flag1 = 0;

int sw_flag2 = 0;

int sw_flag3 = 0;

int old_state1 = 1;

int old_state2 = 1;

int old_state3 = 1;

 

int sw1_clock_flag = 0;

int sw1_sensor_flag = 0;

int sw2_clock_flag = 0;

int sw2_sensor_flag = 0;

int sw3_select_flag = 0;

long reset_timer = 0;

int start_flag = 1;

int eeprom_flag = 0;

 

int cds_value = 0;

int old_cds_value = 0;

int avg_cds = 0;

int avg_cds_value = 0;

int cds_count = 0;

String cds_value_str1000;

String cds_value_str100;

String cds_value_str10;

String cds_value_str1;

int POTEN = A0;

 

int temp_value = 0;

float temp = 0;

float old_temp = 0;

float avg_temp = 0;

float eeprom_avg_temp = 0;

String temp_str;

int temp_pin = A1;

int temp_count = 0;

 

void setup()

{

  cds_mode_setup();

  sw_mode_setup();

  lcd.init();

  lcd.init();

  lcd.backlight();

}

 

void loop()

{

  if(start_flag == 1)

  {

    start_mode();

    reset_mode();

  }

  else

  {

    sw_mode_1();

    sw_mode_2();

    sw_mode_3();

    act_mode();

    sensor_mode();

  }

}

 

void start_mode()

{

  eeprom_flag = EEPROM.read(0);

 

  for(int i=0; i<5; i++)

  {

    lcd.setCursor(0,0);

    lcd.print("Push sw1");

    lcd.setCursor(0,1);

    lcd.print("EEPcheck screen");

  }

}

 

void act_mode()

{

  if(sw1_clock_flag == 1)

  {

    lcd.setCursor(0,0);

    lcd.print("Repush sw1");

    lcd.setCursor(0,1);

    lcd.print("                ");

  }

  if(sw1_sensor_flag == 1)

  {

    lcd.setCursor(0,0);

    lcd.print("please push sw2");

    lcd.setCursor(0,1);

    lcd.print("                ");

  }

}

 

void sensor_mode()

{

  if(sw2_sensor_flag == 1)

  {

    cds_mode();

    temp_mode();

  }

}

 

void cds_mode_setup()

{

  Serial.begin(9600);

}

 

void cds_mode()

{

  cds_value = analogRead(POTEN);

  Serial.println(cds_value);

  avg_cds = (avg_cds + cds_value)/2;

  cds_count++;

  if(cds_count == 30)

  {

    cds_count = 0;

    if(old_cds_value != avg_cds)

    {

      old_cds_value = avg_cds;

      cds_value_str1000 = String(avg_cds/1000);

      cds_value_str100 = String((avg_cds%1000)/100);

      cds_value_str10 = String((avg_cds%100)/10);

      cds_value_str1 = String(avg_cds%10);

 

      lcd.setCursor(0,1);

      lcd.print("cds:"+cds_value_str1000+cds_value_str100+

      cds_value_str10+cds_value_str1);

    }

  }

}

 

void temp_mode()

{

  temp_value = analogRead(temp_pin);

  temp = temp_value * 5000.0 / 1024.0;

  delay(40);

  float gg = (temp - 500) / 10.0;

 

  avg_temp = (avg_temp + gg)/ 2;

  temp_count++;

  if(temp_count == 30)

  {

    temp_count = 0;

    if(old_temp != avg_temp)

    {

      old_temp = avg_temp;

      temp_str = String(avg_temp);

      lcd.setCursor(8,1);

      lcd.print(" T:"+temp_str);

    }

  }

}

 

void sw_mode_setup()

{

  pinMode(sw1,INPUT);

  pinMode(sw2,INPUT);

  pinMode(sw3,INPUT);

}

 

void sw_mode_1()

{

  s_state1 = digitalRead(sw1);

  if(old_state1 != s_state1)

  {

    old_state1 = s_state1;

    if(s_state1 == HIGH)

    {

      if(sw2_clock_flag == 0 && sw2_sensor_flag == 0)

      {

        sw_flag1++;

        if(sw_flag1 > 1)

        {

          sw_flag1 = 0;

        }

          if(sw_flag1%2 == 1)

          {

            sw1_clock_flag = 1;

            sw1_sensor_flag = 0;

          }

          else

          {

            sw1_sensor_flag = 1;

            sw1_clock_flag = 0;

          }

        }

        if(sw2_clock_flag == 1)

        {

          sw1_clock_flag = 1;

          sw2_clock_flag = 0;

        }

        if(sw2_sensor_flag == 1)

        {

          sw1_sensor_flag = 1;

          sw2_sensor_flag = 0;

        }

      }

    }

  }

 

void sw_mode_2()

{

  s_state2 = digitalRead(sw2);

  if(old_state2 != s_state2)

  {

    old_state2 = s_state2;

    if(s_state2 == HIGH)

    {

      if(sw1_clock_flag == 1)

      {

        sw2_clock_flag = 1;

        sw1_clock_flag = 0;

      }

      else

      {

        sw2_clock_flag = 0;

      }

      if(sw1_sensor_flag == 1)

      {

        sw2_sensor_flag = 1;

        sw1_sensor_flag = 0;

        lcd.clear();

      }

      else

      {

        sw2_sensor_flag = 0;

      }

    }

  }

}

 

void sw_mode_3()

{

  s_state3 = digitalRead(sw3);

  if(old_state3 != s_state3)

  {

    old_state3 = s_state3;

    if(s_state3 == HIGH)

    {

      if(sw2_sensor_flag == 1)

    {

      EEPROM.write(0,cds_value);

      EEPROM.put(1,avg_temp);

    }

    else if(sw1_clock_flag == 0 && sw2_clock_flag == 0 && 

    sw1_sensor_flag == 0 && sw2_sensor_flag == 0)

    {

      eeprom_mode();

    }

    }

  }

}

 

void reset_mode()

{

  start_flag = 0;

  s_state1 = 0;

  s_state2 = 0;

  s_state3 = 0;

  sw_flag1 = 0;

  sw_flag2 = 0;

  sw_flag3 = 0;

  old_state1 = 1;

  old_state2 = 1;

  old_state3 = 1;

 

  sw1_clock_flag = 0;

  sw1_sensor_flag = 0;

  sw2_clock_flag = 0;

  sw2_sensor_flag = 0;

  sw3_select_flag = 0;

  

  temp = 0;

  temp_value = 0;

  cds_value = 0;

}

 

void eeprom_mode()

{

  cds_value = EEPROM.read(0);

  EEPROM.get(1,eeprom_avg_temp);

 

    cds_value_str1000 = String(cds_value/1000);

    cds_value_str100 = String((cds_value%1000)/100);

    cds_value_str10 = String((cds_value%100)/10);

    cds_value_str1 = String(cds_value%10);

    lcd.setCursor(0,1);

    lcd.print("cds:"+cds_value_str1000+cds_value_str100+

    cds_value_str10+cds_value_str1);

 

    temp_str = String(eeprom_avg_temp);

    lcd.setCursor(8,1);

    lcd.print(" T:"+temp_str);    

}

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기
  • 카카오톡으로 보내기

댓글 : 5

조회수 : 371

master님의 댓글

master 작성일

LCD 흐린 것부터 적어드리죠
LCD모듈에 있는 휘도조절용 반고정 가변저항을 돌려서 밝기를 조절하시고
만약, 가변저항으로 해결이 안된다면
코드에서 lcd.clear();를 너무 자주하는 것은 아닌지 체크하세요
act_mode()에서 lcd.setCursor(0,1); lcd.print("                "); 계속해서 삭제할 수도 있겠습니다.
//
밝기라는 것이 CDS값을 말하는 것인가요?

master님의 댓글

master 작성일

void start_mode(){
  eeprom_flag=EEPROM.read(0);
여기서 eeprom_flag 변수를 사용하고 있는 곳이 없으니 이 변수는 삭제해야겠습니다.

master님의 댓글

master 작성일

void eeprom_mode(){
  cds_value=EEPROM.read(0);
여기서 읽어온다는 것은 알겠습니다만
void cds_mode(){
  cds_value=analogRead(POTEN);
여기서도 읽어오고 있으며
eeprom_mode()는 스위치 누를 때 1회만 실행되지만
cds_mode()는 스위치를 누르지 않아도 계속해서 실행되므로
eeprom_mode()에서 읽어봤자 cds_mode()로 무시된다고 보면 됩니다.

master님의 댓글

master 작성일

int 는 2바이트 크기이고
float는 4바이트 크기입니다.
  cds_value=EEPROM.read(0); EEPROM.write(0,cds_value);
1바이트 크기만 읽고 쓴다면 상관없지만 2바이트 크기이므로
EEPROM.get(0,cds_value); EEPROM.put(0,cds_value);
이 함수를 사용하는 것이 좋겠죠
//
EEPROM.get(1,eeprom_avg_temp); EEPROM.put(1,avg_temp);
어드레스도 변경 해줘야 합니다.
EEPROM.get(4,eeprom_avg_temp); EEPROM.put(4,avg_temp);
2로 해도 되겠지만 여유가 많으니 4로 했습니다.
//
EEPROM.get(4,eeprom_avg_temp); EEPROM.put(4,avg_temp);
쓸 때와 읽을 때의 변수명이 다릅니다.

EEPROM.get(0,cds_value); EEPROM.put(0,cds_value);
cds는 avg_cds 변수를 읽고 쓰지 않나요?

master님의 댓글

master 작성일

코드를 좀 많이 변경해서 답글에 적어보죠

게시물 검색

BASIC4MCU > 질문게시판 목록

제목 날짜
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은… 스태프  19-01-15
공지 사이트 이용 안내 댓글[31] master  17-10-29
질문 atmega128 recipe for target 'm… 댓글[3] hhhyyyeee  24-06-19
질문 atmega128 코드 합치기 앗메  24-06-18
답변 답변 : atmega128 코드 합치기 master  24-06-19
질문 아두이노 파력발전 댓글[1] sighn  24-06-16
질문 ATmega4809 nRF24L01 모듈을 이용한 무선… 댓글[3] Ahri  24-06-12
질문 atmega128에 dht11 왜 측정을 못하죠? 댓글[1] 탈북한시민  24-06-11
질문 atmega128이 실행이 되지 않습니다 댓글[1] 첨부파일니굴  24-06-10
질문 아트메가 128 쓰는디 while 문이 안먹혀요 댓글[1] 수히  24-06-09
질문 atmega128 UART통신으로 FND출력 Rion  24-06-09
답변 답변 : atmega128 UART통신으로 FND출력 댓글[1] master  24-06-10
질문 atmega128 라인트레이서 코드와 회로도 질문...… 댓글[2] 첨부파일왕두일  24-06-06
답변 답변 : atmega128 라인트레이서 코드와 회로도 … master  24-06-07
질문 atmega128을 이용한 LCD 사용에 문제가 발생했… 댓글[3] 네넴  24-06-05
질문 Co 센서 값에 따른 ppm을 계산하려는데 댓글[1] 라칸  24-06-05
질문 17HS4401, A4988 스텝모터 제어 댓글[1] jhbaik  24-06-03
질문 코드비전avr을 이용한 아두이노 우노 제어 댓글[1] gkstntjd  24-05-29
질문 Energia 시리얼 모니터에 아무것도 출력되지않습니다… 댓글[1] 김의공  24-05-22
질문 아두이노 스위치, 에어펌프 연결 댓글[1] 첨부파일존존  24-05-20
질문 MSP430런치패드를 이용한 LCD 코딩 관련 질문 댓글[1] 뀨쥰이  24-05-16
질문 생활 속 가스 센서 첨부파일Fosen  24-05-13
질문 atmega128A로 초음파센서 바밤  24-05-13
답변 답변 : atmega128A로 초음파센서 master  24-05-13
질문 eeprom 값 출력이 다르게 나옵니다 댓글[5] 첨부파일idghte  24-05-05
답변 답변 : eeprom 값 출력이 다르게 나옵니다 master  24-05-05
질문 센서나 블루투스에서 조건문이 실행이 느립니다. 현아  24-05-03
답변 답변 : 센서나 블루투스에서 조건문이 실행이 느립니다. master  24-05-03
질문 님들 MG811 이산화탄소 센서를 쓰는데 라칸  24-05-03
답변 답변 : 님들 MG811 이산화탄소 센서를 쓰는데 master  24-05-03
게시물 검색


Privacy Policy
MCU BASIC ⓒ 2017
PC버전