Нужна помощь в коде.
- Войдите на сайт для отправки комментариев
Доброго времени суток уважаемое сообщество.
Недавно купил Ардуину и решил что-нибудь сделать. Ардуина у меня 1.5 недели , с С## разбираюсь неделю с нуля (сам). Когда то давно(очень) изучал бейсик. Прошу сильно не смеятся с кода. Что-то вычитал сдесь, что-то на других ресурсах...
Банальный градусник с двумя датчиками температуры, барометр и датчик влажности плюс часы. Все это выводится на индикатор 20х4. Имеются три кнопки для настройки часов. Кнопка "Меню" при длительном нажатии -вход в режим настройки(ей же перемещаемся по часам, минутам, секундам и дням) и кнопки + и -(увеличить или уменьшить значение). Стоит фотоприемник. С пульта ИК, кнопкой можно вкл/выкл подсветку индикатора. Кнопка пульта запоминается в EEPROM. Понимаю что у меня получился быдлокод - просьба ткните носом в особо бесграмотные места.
Помощ нужна : как сделать что бы запрограмированная на вкл /выкл подсветки кнопка ИК пульта при длительном удержании вызавала функцию настройки часов???? Хотя бы алгоритм.... За пример с подробными коментариями буду в двойне благодарен.
#include <EEPROM.h> #include <IRremote.h> #include <class_noDELAY.h> #include <LCD_1602_RUS.h> #include <Wire.h> #include <Adafruit_BMP085.h> #include <DHT.h> #include <RTC.h> #include "sav_button.h" LCD_1602_RUS lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 20 chars and 4 line display int RECV_PIN = 11; //вход ИК приемника IRrecv irrecv(RECV_PIN); decode_results results; RTC time; Adafruit_BMP085 bmp; #define DHTPIN 2 // PIN подключения DHT #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 тип датчика DHT dht(DHTPIN, DHTTYPE); SButton button_Men(4,50,1000,4000,500); //---кнопка меню SButton button_PL(5,50,1000,4000,500); //---кнопка + SButton button_MN(6,50,1000,4000,500); //---кнопка- noDELAY nD_CL; //---задержка обновления часов noDELAY nD_DHT; //---задержка обновления DHT noDELAY nD_BMP; //---задержка обновления BMP bool lc = false; //---состояние подсветки экрана long result; //---код кнопки ИК пульта из EEPROM long ir_lc; //---код принятый с пульта void setup() { delay(300); lcd.init(); lcd.backlight(); button_Men.begin(); button_PL.begin(); button_MN.begin(); irrecv.enableIRIn(); // включить приемник // инициализация модуля RTC time.begin(RTC_DS3231); // на базе чипа DS3231 модуль подключается к аппаратным выводам I2C dht.begin(); // инициализация модуля DHT bmp.begin(); // инициализация модуля BMP // установка даты и времени // time.settime(0,44,10,28,04,16,3); // 0 сек, 17 мин, 15 час, 1, октября, 2015 года, четверг // time.settime(35,10,20); // 35 сек, 10 мин, 20 час, дату оставить без изменений // time.settime(-1,-1,-1,31,12,15); // 31, декабря, 2015 года, время и день недели оставить без изменений nD_CL.start(); nD_BMP.start(); nD_DHT.start(); // получение данных с DHT //int h = dht.readHumidity(); //int t = dht.readTemperature(); //отрисовка экрана lcd.setCursor(0,3); lcd.print(L"ВЛАЖНОСТЬ:"); lcd.setCursor(19,3); lcd.print("%"); lcd.setCursor(7,1); lcd.setCursor(0,1); lcd.print(L"ТЕМП: "); lcd.setCursor(12,1); lcd.print(L"°"); lcd.setCursor(19,1); lcd.print(L"°"); lcd.setCursor(0,2); lcd.print(L"ДАВЛЕНИЕ:"); lcd.setCursor(18,2); lcd.print(L"мм"); lcd.setCursor(11,2); lcd.print(bmp.readPressure()/133.3,0); lcd.setCursor(7,1); lcd.print(bmp.readTemperature(),1); //читаем EEPROM кнопку int address=0; EEPROM.get( address, result ); Serial.begin(9600); } //******************************************************************** void loop() { nD_CL.read(1000); nD_BMP.read(10000); nD_DHT.read(2000); lcd.noBlink(); //*********************Задержка и вывод времени****************************************** if (nD_CL.tick) { lcd.setCursor(0,0); lcd.print(time.gettime("d-m, H:i:s, D")); } //*********************Задержка вывода датчиков*************************************** if (nD_DHT.tick) { //int h = dht.readHumidity(); // Read temperature as Celsius (the default) //int t = dht.readTemperature(); lcd.setCursor(14,1); lcd.print(dht.readTemperature(),1); lcd.setCursor(11,3); lcd.print(dht.readHumidity(),0); } if (nD_BMP.tick) { lcd.setCursor(11,2); lcd.print(bmp.readPressure()/133.3,0); lcd.setCursor(7,1); lcd.print(bmp.readTemperature(),1); } //------------------вход в режим настройки часов длительным нажатием кнопки меню------------------------- switch( button_Men.Loop() ) { case SB_LONG_CLICK: set_sh(); break; } //--------------обработка команд пульта----------------------- //Serial.print(lc); int x=0; if (irrecv.decode(&results)) { long ir_lc=results.value; Serial.println(results.value); if (ir_lc == result ) //---если нажетая кнопка на пульте совпадает со считанной из памяти { //----меняем состояние подсветки if (lc == false){lcd.noBacklight(); lc = !lc; } else {lcd.backlight(); lc = !lc;} irrecv.resume(); } // -------------вызов функции обучения и запоминания пульта длительным нажатием + ------------------- switch( button_PL.Loop() ) { case SB_LONG_CLICK: IR_liarn( ir_lc); break; } } //************************************************************************************************ //******************************конец основной программы****************************************** //************************************************************************************************ //************************************************************************************************ //*****************************функция установки часов******************************************** void set_sh() { unsigned long currentMillis; long previousMillis=millis(); //int Dn; //int ms; //int gd; int kurs=8; lcd.setCursor(8,0); lcd.blink(); // setp: currentMillis = millis(); //n=currentMillis - previousMillis; // Если ни чего не делали выход из режима установки времени автоматически if( currentMillis - previousMillis > 20000) { return; } // задержка обновления часов на экране 1сек nD_CL.read(1000); //считывание текущего времени int Dn=time.weekday; int sh=time.Hours; int mn=time.minutes; int sc=time.seconds; //-----выход при длительном нажатии кн "меню"------------------ switch( button_Men.Loop() ) { case SB_LONG_CLICK: // выход при длительном нажатии кнопки "Men" return; break; //-----------ПЕРЕМЕЩЕНИЕ курсора коротким нажатием кн "меню"--------------------- case SB_CLICK: previousMillis=currentMillis; //если перемещали курсор - сброс счетчика выхода из режима kurs=kurs+3; if (kurs<=18) {} else {kurs=8; lcd.setCursor(kurs,0); } break; } //-----------------------УВЕЛИЧЕНИЕ значения под курсором------------------ switch( button_PL.Loop() ) { case SB_CLICK: previousMillis=currentMillis; //если нажимали"+" - сброс счетчика выхода из режима if (kurs==8) { sh=sh+1; if (sh<=23){} else{sh=0;} time.settime(-1,-1,sh); taim(kurs); } if (kurs==11) { mn=mn+1; if (mn<=59){} else{mn=0;} time.settime(-1,mn);taim(kurs); } if (kurs==14) {sc=0; time.settime(0); taim(kurs);} if (kurs==17) {Dn=Dn+1; if (Dn<=5){} else {Dn=0;} time.settime(-1,-1,-1,-1,-1,-1,Dn); taim(kurs); } break; } //-----------------------Уменьшение значения под курсором------------------ switch( button_MN.Loop() ) { case SB_CLICK: previousMillis=currentMillis; //если нажимали"-" - сброс счетчика выхода из режима if (kurs==8) {sh=sh-1; if (sh<=23){} else{sh=0;} time.settime(-1,-1,sh); taim(kurs); } if (kurs==11) {mn=mn-1; if (mn<=59){} else{mn=0;} time.settime(-1,mn); taim(kurs); } if (kurs==14){sc=0; time.settime(0); taim(kurs);} if (kurs==17) {Dn=Dn-1; if (Dn<=5){} else {Dn=0;} time.settime(-1,-1,-1,-1,-1,-1,Dn); taim(kurs); } break; } //********************************задержка обновленияи ндикации часов**************************** if (nD_CL.tick) { lcd.setCursor(7,0); lcd.print(time.gettime("H:i:s, D")); lcd.setCursor(kurs,0); } goto setp; } //************************************************************************************************* //*****************************функция обновления времени при установке**************************** void taim(int kurs) // { lcd.setCursor(7,0); lcd.print(time.gettime("H:i:s, D")); lcd.setCursor(kurs,0); } //************************************************************************************************* //****************************функция обучения командам пульта и запись в EEPROM******************* long IR_liarn(long ir_lc) { //{Serial.print("liarn"); qw: int address=0; if (irrecv.decode(&results)) // Если данные пришл { delay(300); //---если код нажатой кнопки совпадает с существующей то выход if (results.value==result){ //Serial.print("Now"); return result; } //---иначе пишем в память else { //Serial.print("noPult"); EEPROM.put(address,results.value); delay(100); return result=results.value; } irrecv.resume(); // Принимаем следующую команд } goto qw; } //************************************************************************************************** //**************************************************************************************************
Прошу прощения , код в первом сообщении не рабочий. Вот рабочий:
Кнопка ИК пульта при удержании выдает код, а потом нули повторяющиеся.