Нужна помощь в коде.
- Войдите на сайт для отправки комментариев
Доброго времени суток уважаемое сообщество.
Недавно купил Ардуину и решил что-нибудь сделать. Ардуина у меня 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;
}
//**************************************************************************************************
//**************************************************************************************************
Прошу прощения , код в первом сообщении не рабочий. Вот рабочий:
#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>=0){} else{sh=23;} time.settime(-1,-1,sh); taim(kurs); } if (kurs==11) {mn=mn-1; if (mn>=0){} else{mn=59;} time.settime(-1,mn); taim(kurs); } if (kurs==14){sc=0; time.settime(0); taim(kurs);} if (kurs==17) {Dn=Dn-1; if (Dn>=0){} else {Dn=6;} 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; } //************************************************************************************************** //**************************************************************************************************Кнопка ИК пульта при удержании выдает код, а потом нули повторяющиеся.