BASIC4MCU | 질문게시판 | eeprom 값 출력이 다르게 나옵니다
페이지 정보
작성자 idghte 작성일2024-05-05 05:38 조회2,325회 댓글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);
}
댓글 5
조회수 2,325master님의 댓글
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 작성일코드를 좀 많이 변경해서 답글에 적어보죠