Некорректная работа меню Ардуино Шилд

Andrii P
Offline
Зарегистрирован: 24.11.2014

Добрый вечер всем !. П

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
#include <EEPROM2.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

#define BACKLIGHT_PIN 10//int backLight = 10;
boolean backlightStatus = 1;
int relay1 = 2;
int relay2 = 3;
int relay3 = 11;
int relay4 = 12;
float temp1=0; //переменная для текущего значения температуры
int setTmp1;// переменная для заданного значения температуры

float temp2=0; //переменная для текущего значения температуры
int setTmp2=0; // переменная для заданного значения температуры
float temp3=0; //переменная для текущего значения температуры
int setTmp3=0;
float temp4=0; //переменная для текущего значения температуры
int setTmp4=0;

#define ONE_WIRE_BUS 13
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

DeviceAddress Probe001 = { 0x28, 0xBF, 0x7A, 0x15, 0x06, 0x00, 0x00, 0x85 };
DeviceAddress Probe002 = { 0x28, 0x74, 0x61, 0x15, 0x06, 0x00, 0x00, 0xEE };
DeviceAddress Probe003 = { 0x28, 0x5A, 0x36, 0x15, 0x06, 0x00, 0x00, 0x8F };
DeviceAddress Probe004 = { 0x28, 0xB0, 0x7B, 0x15, 0x06, 0x00, 0x00, 0x6C };

#define KEYPAD_PIN A0
//Определим значения на аналоговом входе для клавиатуры 
#define ButtonUp_LOW 120
#define ButtonUp_HIGH 140
#define ButtonDown_LOW 250
#define ButtonDown_HIGH 350
#define ButtonLeft_LOW 450
#define ButtonLeft_HIGH 450
#define ButtonRight_LOW 0
#define ButtonRight_HIGH 80
#define ButtonSelect_LOW 690
#define ButtonSelect_HIGH 780
void setup()
{
 
sensors.begin();
sensors.setResolution(Probe001, 12);
sensors.setResolution(Probe002, 12);
sensors.setResolution(Probe003, 12);
sensors.setResolution(Probe004, 12);

setTmp1=EEPROM_read_byte(0);
//pinMode(backLight, INPUT); // влк викл підсвідки input output
//digitalWrite(backLight, LOW); // нерухати завжки має бути lo
pinMode(BACKLIGHT_PIN, OUTPUT);
digitalWrite(BACKLIGHT_PIN, backlightStatus);

pinMode(relay1, OUTPUT); 
digitalWrite(relay1, HIGH);

pinMode(relay2, OUTPUT); 
digitalWrite(relay2, HIGH);

pinMode(relay3, OUTPUT); 
digitalWrite(relay3, HIGH);

pinMode(relay4, OUTPUT); 
digitalWrite(relay4, HIGH);

lcd.begin(16,2);
lcd.setCursor(2,0);
lcd.print("Solar Heater");
delay(3000);
lcd.setCursor(3,1);
lcd.print("Controller");
delay(3000);
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Andrii PROject");
delay(3000);
lcd.setCursor(2,1);
lcd.print("version  1.8");
delay(2000);
lcd.clear();
lcd.print("Loading data");
delay(500);
lcd.print(".");
delay(500);
lcd.print(".");
delay(500);
lcd.print(".");
delay(2000);
lcd.clear(); 
}

float printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
}
int ReadKey(int keyPin)
{
 int KeyNum=0;
 int KeyValue1=0;
 int KeyValue2=0;

//Читаем в цикле аналоговый вход, для подавления дребезга и нестабильности читаем по два раза подряд, пока значения не будут равны.
//Если значения равны 1023 – значит не была нажата ни  одна клавиша.
do {KeyValue1=analogRead(keyPin);KeyValue2=analogRead(keyPin);} 
while(KeyValue1==KeyValue2&&KeyValue2!=1023);

//Интерпретируем полученное значение и определяем код нажатой клавиши
 if (KeyValue2<ButtonUp_HIGH&&KeyValue2>ButtonUp_LOW) {KeyNum=1;}//Up
 if (KeyValue2<ButtonDown_HIGH&&KeyValue2>ButtonDown_LOW) {KeyNum=2;}//Down
 if (KeyValue2<ButtonLeft_HIGH&&KeyValue2>ButtonLeft_LOW) {KeyNum=3;}//Left
 if (KeyValue2<ButtonRight_HIGH&&KeyValue2>ButtonRight_LOW) {KeyNum=4;}//Right
 if (KeyValue2<ButtonSelect_HIGH&&KeyValue2>ButtonSelect_LOW) {KeyNum=5;}//Select

//Возвращаем код нажатой клавиши
return KeyNum;
}

//Определим процедуру редактирования заданной температуры
//Вызывается по нажатию клавиши Select, отображает на дисплее заданную температуру и позволяет изменять ее клавишами Up и Down
void setTemperature_1() {
int keyCode=0;
//выводим на дисплей заданное значение температуры  
lcd.begin(16,2);
lcd.setCursor(0, 0);
lcd.print(">> Set temp 1 <<");
lcd.setCursor(0, 1);
lcd.print("*");
lcd.setCursor(2, 1);
lcd.print(setTmp1);
//Опрашиваем клавиатуру, если нажата клавиша Up увеличиваем значение на 1, если Down – уменьшаем на 1
//Если нажаты клавиши Select или Right – цикл опроса прерывается
//Задержки введены для борьбы с дребезгом, если клавиши срабатывают четко – можно уменьшить время задержек или вообще их убрать
do {
  keyCode=ReadKey(KEYPAD_PIN);
  if (keyCode==1){setTmp1+=1 && setTmp1<=98;delay(200);lcd.setCursor(6,1);lcd.write((uint8_t)1);lcd.setCursor(7, 1);lcd.print(setTmp1);}
  if (keyCode==2){setTmp1-=1 && setTmp1>=2;delay(200);lcd.setCursor(6,1);lcd.write((uint8_t)2);lcd.setCursor(7, 1);lcd.print(setTmp1);}
} while (keyCode!=5 && keyCode!=4);
  delay(200);
//По клавише Select – созраняем в EEPROM измененное значение
//По клавише Right – восстанавливаем старое значение
if (keyCode==5) {EEPROM_write_byte(0, setTmp1);lcd.setCursor(12, 1);lcd.print("SAVE");delay(2000);}
if (keyCode==4) {setTmp1 = EEPROM_read_byte(0);lcd.setCursor(12, 1);lcd.print("EXIT");delay(2000);}
}

void setTemperature_2() {
int keyCode=0;
//выводим на дисплей заданное значение температуры  
lcd.begin(16,2);
lcd.setCursor(0, 0);
lcd.print(">> Set temp 2 <<");
lcd.setCursor(7, 1);
lcd.print(setTmp2);
//Опрашиваем клавиатуру, если нажата клавиша Up увеличиваем значение на 1, если Down – уменьшаем на 1
//Если нажаты клавиши Select или Right – цикл опроса прерывается
//Задержки введены для борьбы с дребезгом, если клавиши срабатывают четко – можно уменьшить время задержек или вообще их убрать
do {
  keyCode=ReadKey(KEYPAD_PIN);
  if (keyCode==1){setTmp2++;delay(200);lcd.setCursor(7, 1);lcd.print(setTmp2);}
  if (keyCode==2){setTmp2--;delay(200);lcd.setCursor(7, 1);lcd.print(setTmp2);}
} while (keyCode!=5 && keyCode!=4);
  delay(200);
//По клавише Select – созраняем в EEPROM измененное значение
//По клавише Right – восстанавливаем старое значение
if (keyCode==5) {delay(200);EEPROM_write_byte(1, setTmp2);}
if (keyCode==4) {delay(200);setTmp1 = EEPROM_read_byte(1);}
}

void setbacklight() {
int keyCode=0;
//выводим на дисплей заданное значение температуры  
  lcd.begin(16,2);
  lcd.setCursor(0, 0);
  lcd.print(">Set back_light<");
//Опрашиваем клавиатуру, если нажата клавиша Up увеличиваем значение на 1, если Down – уменьшаем на 1
//Если нажаты клавиши Select или Right – цикл опроса прерывается
//Задержки введены для борьбы с дребезгом, если клавиши срабатывают четко – можно уменьшить время задержек или вообще их убрать
do {
  keyCode=ReadKey(KEYPAD_PIN);
  if (keyCode==1){backlightStatus=1;digitalWrite(BACKLIGHT_PIN, backlightStatus);lcd.setCursor(0, 1);lcd.print("-> ON ");}
  if (keyCode==2){backlightStatus=0;digitalWrite(BACKLIGHT_PIN, backlightStatus);lcd.setCursor(0, 1);lcd.print("-> OFF ");}
} while (keyCode!=4);
  delay(200);

//По клавише Select – созраняем в EEPROM измененное значение
//По клавише Right – восстанавливаем старое значение
if (keyCode==4) {setTmp1 = EEPROM_read_byte(1);lcd.setCursor(12, 1);lcd.print("EXIT");}
}

void loop()
{
my_char();
}
void my_char() 
{
byte on[8] = {0b00100,0b01110,0b11111,0b00100,0b00100,0b00100,0b00100,0b00100};
byte off[8] = {0b00100,0b00100,0b00100,0b00100,0b00100,0b11111,0b01110,0b00100};
byte one[8] = {0b11111,0b11011,0b10011,0b11011,0b11011,0b11011, 0b10001,0b11111};
byte two[8] = {0b11111,0b10001,0b10101,0b11101,0b11011,0b10111,0b10001,0b11111};
byte three[8] = {0b11111,0b10001,0b11101,0b11011,0b11101,0b11101,0b10001,0b11111};
byte four[8] = {0b11111,0b11101,0b11001,0b10101,0b10001,0b11101,0b11101,0b11111};
byte celsium[8] = {0b01000,0b10100,0b01000,0b00000,0b00110,0b01000,0b01000,0b00110};
lcd.createChar(1,on);
lcd.createChar(2,off);
lcd.createChar(3,one);
lcd.createChar(4,two);
lcd.createChar(5,three);
lcd.createChar(6,four);
lcd.createChar(7,celsium);

//delay(500); // затримка зчитування датчиків

sensors.requestTemperatures();

float temp1 = printTemperature(Probe001);

if (temp1 == -127.00) {
lcd.setCursor(0,0);
lcd.write((uint8_t)3);
lcd.print("FAULT");
lcd.setCursor(6,0);
lcd.write((uint8_t)7);
} else {
lcd.setCursor(0,0);
lcd.write((uint8_t)3);
lcd.print(printTemperature(Probe001));
lcd.setCursor(6,0);
lcd.write((uint8_t)7);
}

float temp2 = printTemperature(Probe002);

if (temp2 == -127.00) {
lcd.setCursor(0,1);
lcd.write((uint8_t)4);
lcd.print("FAULT");
lcd.setCursor(6,1);
lcd.write((uint8_t)7);
}else {
lcd.setCursor(0,1);
lcd.write((uint8_t)4);
lcd.print(printTemperature(Probe002));
lcd.setCursor(6,1);
lcd.write((uint8_t)7);
}

float temp3 = printTemperature(Probe003);

if (temp3 == -127.00) {
lcd.setCursor(8,0);
lcd.write((uint8_t)5);
lcd.print("FAULT");
lcd.setCursor(14,0);
lcd.write((uint8_t)7);
}else {
lcd.setCursor(8,0);
lcd.write((uint8_t)5);
lcd.print(printTemperature(Probe003));
lcd.setCursor(14,0);
lcd.write((uint8_t)7);
}
float temp4 = printTemperature(Probe004);

if (temp4 == -127.00) {
lcd.setCursor(8,1);
lcd.write((uint8_t)6);
lcd.print("FAULT");
lcd.setCursor(14,1);
lcd.write((uint8_t)7);
}else {
lcd.setCursor(8,1);
lcd.write((uint8_t)6);
lcd.print(printTemperature(Probe004 ));
lcd.setCursor(14,1);
lcd.write((uint8_t)7);
}

if (temp1>setTmp1) 
{
    digitalWrite(2,LOW);   // вкл
    lcd.setCursor(7,0);  
    lcd.write((uint8_t)1);
    } else if (temp1 <setTmp1)
    {
    digitalWrite(2,HIGH);   //викл
    lcd.setCursor(7,0);
    lcd.write((uint8_t)2);
  }
if (temp2 >32) 
{
    digitalWrite(3,LOW);   // вкл
    lcd.setCursor(7,1);  
   lcd.write((uint8_t)1);
    } else if (temp2 <29)
    {
    digitalWrite(3,HIGH);   //викл
    lcd.setCursor(7,1);
    lcd.write((uint8_t)2);
  }
if (temp3 >32) 
{
    digitalWrite(11,LOW);   // вкл
    lcd.setCursor(15,0);  
    lcd.write((uint8_t)1);
    } else if (temp3 <29)
    {
    digitalWrite(11,HIGH);   //викл
    lcd.setCursor(15,0);
    lcd.write((uint8_t)2);
  }
if (temp4 >32) 
{
    digitalWrite(12,LOW);   // вкл
    lcd.setCursor(15,1);  
   lcd.write((uint8_t)1);
    } else if (temp4 <29)
    {
    digitalWrite(12,HIGH);   //викл
    lcd.setCursor(15,1);
    lcd.write((uint8_t)2);
  }
int Feature = ReadKey(KEYPAD_PIN);
if (Feature==1 ) {delay(200);setTemperature_1();} //Переход к редактированию заданной температуры
if (Feature==2 ) {delay(200);setTemperature_2();}
if (Feature==5 ) {delay(200);setbacklight();}
}

одскажите пожалуйста что я делаю не так!
Я добавлю два скетчи в первом скетчи более менее нормально можно выставит температуру на базе примитивных настроек.

А вот во втором скетчи температура цбррент темп лод корректно отображается но обновляется только после того, если я еКак сделать так, чтобы при включнни ардуино выводилась температура с четырем датчиков а при нажатии кнопки я заходил в меню и мог корректировать настройки заданной температуры четырех датчиков и подсветки и при нажатии еще одной кнопки выйти из меню в просмотр температуры с датчиков.ще раз захожу в меню.И еще как правильно вставить свои символы с первого скетча в другой. Буду благодарен за ответ

Andrii P
Offline
Зарегистрирован: 24.11.2014
Andrii P
Offline
Зарегистрирован: 24.11.2014

Извиняюсь за разбросанный вопрос

Подскажите пожалуйста что я делаю не так!

Я добавлю два скетчи в первом скетчи более менее нормально можно выставит температуру на базе примитивных настроек.

А вот во втором скетчи температура current temp load корректно отображается но обновляется только после того, если я захожу в то меню еще раз.

Как сделать так, чтобы при включнни ардуино выводилась температура с четырем датчиков а при нажатии кнопки я заходил в меню и мог корректировать настройки заданной температуры четырех датчиков и подсветки и при нажатии еще одной кнопки выйти из меню в просмотр температуры с датчиков.

И еще как правильно вставить свои символы с первого скетча в другой.

Буду благодарен за ответ!!!