таймер в режимах (одна кнопка)

bdx376
Offline
Зарегистрирован: 24.05.2016
Друзья,товарищи помогите несчастному)) 
 
суть проблемы в том что есть 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);}

 

 

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Во первых принято выкладывать весь скетч, может Вы pinMode там в сетапе не прописали... еще проверьте просто работает ли у Вас кнопка, подтянута ли она сопротивлением.. теперь опишим словами что делает программа, а вообще сначало лучше комментировать каждую строку, что происходит. необходимо помнить что все операции выполняются последовательно. Итак:

Если кнопка нажата и нет флага то обновляем счетчики, увеличиваем режим и торжественно поднимаем флаг.

Если режим больше 2 то он равен нулю (то есть в 3 режим мы не попадаем вообще, так как он сразу же обнуляется) 

Если кнопка не нажата флажек поднят то приспускаем флажек

Если режим 0 то тушим дисплей

Если режим 1 то пишем очень коряво на дисплее, при этом подсветку не включаем и хрен поймешь что там, скорее всего во 2 строке будет "THW=90%"(смотрим работу функции setCursor)

Если прошло 2000 милисекунд с момента обноления счетчиков(они то у нас обновляются только по кнопке) то режим = 0

Если режим 2 то включаем наконец подсветку, чистим экран,выставляем криво курсор, пишем полив, тупим 500 мс и чистим снова экран

Если прошло 9000 милисекунд с момента обновления счетчиков то режим = 0

bdx376
Offline
Зарегистрирован: 24.05.2016

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);}
}



 

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

По первому посту с режимами попробуйте так

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);}

  

 

bdx376
Offline
Зарегистрирован: 24.05.2016

vosara,Спасибо вам огромное! все за работало !я месяц боролся с этим! скобка такая мелочь, что я только не пробовал! спасибо вам за помощь добрые люди низкий вам поклон ))

fogary
Offline
Зарегистрирован: 05.03.2016

bdx376 пишет:

if (digitalRead(battonPin) == HIGH && flag == 0) {
  . . .
  flag = 1;
  . . .
}

if (digitalRead(battonPin) == LOW && flag == 1) {
  flag = 0;
}

Почему-то кажется, что переменная flag совершенно лишняя и, если ее исключить, второй if то же не нужен.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Если не поднимать флаг то при нажатии кнопки ( у нас цыкл бежит очень быстро) будет выполняться операция много раз. флаг нужен чтобы действие выполнялось один раз до следующего отпускания-нажатия 

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Все правильно флаг нужен а вот previousMillis2 можно удалить тогда строка №59 будет такая if(millis()- previousMillis1 >= 9000)