таймер в режимах (одна кнопка)
- Войдите на сайт для отправки комментариев
Чт, 23/06/2016 - 04:36
Друзья,товарищи помогите несчастному))
суть проблемы в том что есть 3 режима, 2 из них через заданное время (разное время) должны переходить на 3й режим .НО! этого не происходит )) помогите разобраться новичку ))
if
(digitalRead(battonPin) == HIGH && flag == 0)
{
previousMillis1 = millis();
previousMillis2 = millis();
regim ++; //увелечение
flag = 1; //шаг
if
(regim > 2)
{
regim = 0;
}
}
if
(digitalRead(battonPin) == LOW && flag == 1)
{flag = 0;}
if
(regim == 0)
{lcd. noDisplay();}
if
(regim == 1)
{
lcd.display();
lcd.setCursor(1,0);
lcd.print("T=");
lcd.print(round(t));
lcd.print("\1");
//lcd.backlight();
lcd.setCursor(1,1);
lcd.print("H=");
lcd.print(round(h));
lcd.print("%");
lcd.setCursor(1,2);
lcd.print("W=");
lcd.print(round(solidH));
lcd.print("%");
}
if(millis()- previousMillis1 >= 2000)
{(regim = 0);}
if
(regim == 2)
{
lcd.clear();
lcd.backlight();
lcd.setCursor(0,1);
lcd.print(" P O L I V");
delay(500);
lcd.clear();
}
//else{(regim = 0);}
if(millis()- previousMillis2 >= 9000)
{(regim = 0);}
Во первых принято выкладывать весь скетч, может Вы pinMode там в сетапе не прописали... еще проверьте просто работает ли у Вас кнопка, подтянута ли она сопротивлением.. теперь опишим словами что делает программа, а вообще сначало лучше комментировать каждую строку, что происходит. необходимо помнить что все операции выполняются последовательно. Итак:
Если кнопка нажата и нет флага то обновляем счетчики, увеличиваем режим и торжественно поднимаем флаг.
Если режим больше 2 то он равен нулю (то есть в 3 режим мы не попадаем вообще, так как он сразу же обнуляется)
Если кнопка не нажата флажек поднят то приспускаем флажек
Если режим 0 то тушим дисплей
Если режим 1 то пишем очень коряво на дисплее, при этом подсветку не включаем и хрен поймешь что там, скорее всего во 2 строке будет "THW=90%"(смотрим работу функции setCursor)
Если прошло 2000 милисекунд с момента обноления счетчиков(они то у нас обновляются только по кнопке) то режим = 0
Если режим 2 то включаем наконец подсветку, чистим экран,выставляем криво курсор, пишем полив, тупим 500 мс и чистим снова экран
Если прошло 9000 милисекунд с момента обновления счетчиков то режим = 0
Mr.Privet, благодарю вас что вы откликнулись но мои призывы о помощи!)
режима 2 вы правы)
подсветка на дисплее не нужно включать он OLED (видно все хорошо)
проблема в том что в режиме 2 выставленно 9000 милисекунд ,но он гад переходит в режим =0 через 2000 милисекунд как в режиме один! в этом моя основная проблема и непонимание . кнопка работает резюк подтянут ...
я просто хочу что бы дисплей работал в разных режимах разное время логика с режимами карявая но она гасит мне дисплей)
вот весь мой код
//***********БИБЛИОТЕКИ**************** #include <SPI.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #include "DHT.h" #define holdTime 500 //**********БИТОВАЯ МАСКА ЗНАЧКА**************** byte smile[8] = { B11100, B10100, B11100, B00000, B00000, B00000, B00000, B00000, }; //*********НАСТРОЙКА БИБЛЫ*********************** LiquidCrystal_I2C lcd(0x27,20,4); #define DHTPIN 11 //ПИН ПОДКЛЮЧЕНИЯ dht11 #define DHTTYPE DHT11 //ТИП ДАТЧИКА DHT dht(DHTPIN, DHTTYPE); //создаем объект DHT int ledPin = 13; //пин светодиода int battonPin = 2; //пин кнопки int sensorSoil = 1; //датчик почвы int flag = 0; //int val1=0; // флаг состояния int regim = 0; // Переключалка unsigned long previousMillis1 = 0; //переменная со временем unsigned long previousMillis2 = 0; //переменная со временем //unsigned long interval = 2000; //unsigned long interva2 = 70000; void setup() { //*****************Настройка порта вывода ******************** Serial.begin(9600); //скорость Serial.println("сенсоры "); // надпись //*****************Настройка дисплея ******************** lcd.begin(); //инцилизация дисплея lcd.createChar(1, smile); //битовая маска //lcd.backlight(); //подсветка lcd.setCursor(0,1); // 1я строка 1 2 колонка lcd.print(" autopoliv "); //название lcd.setCursor(0,3); lcd.print(" v1.1"); delay(4000); //хадержка 4с lcd.clear(); //выкл дисплея //dht.begin(); // pinMode(battonPin, INPUT); //настройки пина кнопки //pinMode(sensorSoil, INPUT); } void loop() //**********интенджеры**************** { //int batonState ; //int ledHigh ; //ledHigh = digitalRead(ledPin); int val = analogRead(sensorSoil); float h = dht.readHumidity(); float t = dht.readTemperature(); //**********вывод серийного порта *************** if (isnan(t) || isnan(h)) { Serial.println("Failed to read from DHT"); } else { Serial.print("Влажность воздуха: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Температура: "); Serial.print(t); Serial.print(" *C "); Serial.print("Влажность почвы: "); Serial.print(val); Serial.println("%"); } //*************конвертация значений с датчика влажности ************************* val = constrain(val, 80, 400); // ширина значений int solidLevel = map(val, 80, 400, 255, 0); // перевернутые значения int solidH = (solidLevel*100)/255; // перевод в проценты //*****************выбор режима кнопкой ********************************* if (digitalRead(battonPin) == HIGH && flag == 0) { previousMillis1 = millis(); previousMillis2 = millis(); regim ++; //увелечение flag = 1; //шаг if (regim > 2) { regim = 0; } } if (digitalRead(battonPin) == LOW && flag == 1) {flag = 0;} if (regim == 0) {lcd. noDisplay();} if (regim == 1) { lcd.display(); lcd.setCursor(1,0); lcd.print("T="); lcd.print(round(t)); lcd.print("\1"); //lcd.backlight(); lcd.setCursor(1,1); lcd.print("H="); lcd.print(round(h)); lcd.print("%"); lcd.setCursor(1,2); lcd.print("W="); lcd.print(round(solidH)); lcd.print("%"); } if(millis()- previousMillis1 >= 2000) {(regim = 0);} if (regim == 2) { lcd.clear(); lcd.backlight(); lcd.setCursor(0,1); lcd.print(" P O L I V"); delay(500); lcd.clear(); } //else{(regim = 0);} if(millis()- previousMillis2 >= 9000) {(regim = 0);} //*******************Алгоритм полива ********************* if (regim == 2 || h<= 40 && val>=250) { digitalWrite(ledPin, LOW);} else {digitalWrite(ledPin, HIGH);} if (regim == 2 || t<= 30 && val>=250) { digitalWrite(ledPin, LOW);} else {digitalWrite(ledPin, HIGH);} }По первому посту с режимами попробуйте так
if (digitalRead(battonPin) == HIGH && flag == 0) { previousMillis1 = millis(); previousMillis2 = millis(); regim ++; //увелечение flag = 1; //шаг if (regim > 2) { regim = 0; } } if (digitalRead(battonPin) == LOW && flag == 1) {flag = 0;} if (regim == 0) {lcd. noDisplay();} if (regim == 1) { lcd.display(); lcd.setCursor(1,0); lcd.print("T="); lcd.print(round(t)); lcd.print("\1"); //lcd.backlight(); lcd.setCursor(1,1); lcd.print("H="); lcd.print(round(h)); lcd.print("%"); lcd.setCursor(1,2); lcd.print("W="); lcd.print(round(solidH)); lcd.print("%"); if(millis()- previousMillis1 >= 2000) {(regim = 0);} } if (regim == 2) { lcd.clear(); lcd.backlight(); lcd.setCursor(0,1); lcd.print(" P O L I V"); delay(500); lcd.clear(); if(millis()- previousMillis2 >= 9000) {(regim = 0);} } //else{(regim = 0);}vosara,Спасибо вам огромное! все за работало !я месяц боролся с этим! скобка такая мелочь, что я только не пробовал! спасибо вам за помощь добрые люди низкий вам поклон ))
if (digitalRead(battonPin) == HIGH && flag == 0) { . . . flag = 1; . . . } if (digitalRead(battonPin) == LOW && flag == 1) { flag = 0; }Почему-то кажется, что переменная flag совершенно лишняя и, если ее исключить, второй if то же не нужен.
Если не поднимать флаг то при нажатии кнопки ( у нас цыкл бежит очень быстро) будет выполняться операция много раз. флаг нужен чтобы действие выполнялось один раз до следующего отпускания-нажатия
Все правильно флаг нужен а вот previousMillis2 можно удалить тогда строка №59 будет такая if(millis()- previousMillis1 >= 9000)