Некорректная работа меню Ардуино Шилд
- Войдите на сайт для отправки комментариев
Пнд, 24/11/2014 - 23:14
Добрый вечер всем !. П
#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();} }
одскажите пожалуйста что я делаю не так!
Я добавлю два скетчи в первом скетчи более менее нормально можно выставит температуру на базе примитивных настроек.
А вот во втором скетчи температура цбррент темп лод корректно отображается но обновляется только после того, если я еКак сделать так, чтобы при включнни ардуино выводилась температура с четырем датчиков а при нажатии кнопки я заходил в меню и мог корректировать настройки заданной температуры четырех датчиков и подсветки и при нажатии еще одной кнопки выйти из меню в просмотр температуры с датчиков.ще раз захожу в меню.И еще как правильно вставить свои символы с первого скетча в другой. Буду благодарен за ответ
одскажите пожалуйста что я делаю не так!
Я добавлю два скетчи в первом скетчи более менее нормально можно выставит температуру на базе примитивных настроек.
А вот во втором скетчи температура цбррент темп лод корректно отображается но обновляется только после того, если я еКак сделать так, чтобы при включнни ардуино выводилась температура с четырем датчиков а при нажатии кнопки я заходил в меню и мог корректировать настройки заданной температуры четырех датчиков и подсветки и при нажатии еще одной кнопки выйти из меню в просмотр температуры с датчиков.ще раз захожу в меню.И еще как правильно вставить свои символы с первого скетча в другой. Буду благодарен за ответ!!!
Извиняюсь за разбросанный вопрос
Подскажите пожалуйста что я делаю не так!
Я добавлю два скетчи в первом скетчи более менее нормально можно выставит температуру на базе примитивных настроек.
А вот во втором скетчи температура current temp load корректно отображается но обновляется только после того, если я захожу в то меню еще раз.
Как сделать так, чтобы при включнни ардуино выводилась температура с четырем датчиков а при нажатии кнопки я заходил в меню и мог корректировать настройки заданной температуры четырех датчиков и подсветки и при нажатии еще одной кнопки выйти из меню в просмотр температуры с датчиков.
И еще как правильно вставить свои символы с первого скетча в другой.
Буду благодарен за ответ!!!