• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Przewijanie ekranów w pętli
#1
Cześć wszystkim,

Tworzę sterownik klimatu, który ma dość sporo warunków i urządzeń wykonawczych, ale nie w tym rzecz, bo główny kod wykonawczy mam już napisany, poległem na zmianie warunków po przez menu. Próbowałem z prostymi, z wielopoziomowymi, które byłby najlepsze i najprostsze w użytkowaniu, ale niestety nie w programowaniu, albo w ogóle nie działały albo dodając główną petlę wszystko zaczynało migać lub pętla się 
Możliwe, że dodatkowo utrudniłem sobie, upierając się, że zrobię to na LCD Keypad Shield od DF Robot, taki mam i taki chcę/muszę wykorzystać.
Potrzebuję jedynie zmieniać nastawy parametrów, które w kodzie są jako int. Znalazłem i zmodyfikowałem kawałek kodu, który robi to idealnie, za pomocą klawiszy góra/dół zmienia nastawę wilgotności, a lewo/prawo temperaturę, przycisk Select przenosi na 5s do drugiego ekranu na którym jest wyświetlana instrukcja użycia.
Moje pytanie brzmi, czy można zrobić w ten sposób, żeby przycisk Select przełączał kolejne ekrany od pierwszego do ostatniego w pętli, na których będzie można ustawiać daną wartość, przy pomocy UP/Down lub Right/Left. 
Ma ktoś pomysł jak zacząć to pisać?
Załączam kod który już mam, i działa tak jak bym to chciał zrobić.
Kod:
#include <LiquidCrystal_I2C.h>
#include <DFR_Key.h>
#include <DHT.h>

//zmienne początkowe
int temp = 25;
int hum = 50;
int hzal = 1;
int hwyl = 2;
int minzal = 15;
int minwyl = 15;

// DHT22 (AM2023)
#define DHTPIN 2
#define DHTTYPE DHT22
const int relay1 =  5;
const int relay2 =  6;
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C  lcd(0x27,2,1,0,4,5,6,7);
DFR_Key keypad;
int localKey = 0;
String keyString = "";
int lcd_key     = 0;
int adc_key_in  = 0;

#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

int read_LCD_buttons(){               
    adc_key_in = analogRead(0);
    if (adc_key_in > 1000) return btnNONE;
    if (adc_key_in < 50)   return btnRIGHT; 
    if (adc_key_in < 250)  return btnUP;
    if (adc_key_in < 450)  return btnDOWN;
    if (adc_key_in < 650)  return btnLEFT;
    if (adc_key_in < 850)  return btnSELECT; 
   
}
             
void setup()
{
  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Terrarium v1");
  lcd.setCursor(0, 1);
  lcd.print("instrukcja pod select");
  delay(2500);
  Serial.begin(9600);
  dht.begin();
  delay(1000);
  lcd.clear();
   
  //Sample rate (default 10 ms)
  keypad.setRate(10);
  digitalWrite(relay1, HIGH);
  digitalWrite(relay2, HIGH);

}

void loop()
{
 
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (isnan(t) || isnan(h)) { //sprawdzenie stanu czujników
    lcd.begin(16, 2);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Błąd czujnika!!");
    delay(10000);
  } else {
   
    // zmiana wartości warunków
   
    lcd_key = read_LCD_buttons();
    switch (lcd_key){
       
       case btnLEFT:{
             temp = temp +1;
             break;
       }
       case btnRIGHT:{
             temp = temp - 1;
             break;
       }
       case btnUP:{
             hum = hum + 5;
             break;
       }
       case btnDOWN:{
             hum = hum - 5;
             break;
       }
       case btnSELECT:{
            lcd.begin(16, 2);
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print ("Hum:");
            lcd.print(h);
            lcd.print((char)223);
            lcd.print("%");
            lcd.setCursor(0, 1);
            lcd.print("Temp L/R +-1");
            lcd.print((char)223);
            lcd.print("C");
            delay (5000);
            break;
     }
  }
   
    lcd.setCursor(0, 0);
    lcd.print("Hum: ");
    lcd.print(h);
    lcd.print("%");
    lcd.print("(");
    lcd.print(hum);
    lcd.print("%)");
   
    lcd.setCursor(0, 1);
    lcd.print("Tem: ");
    lcd.print(t);
    lcd.print((char)223);
    lcd.print("(");
    lcd.print(temp);
    lcd.print((char)223);
    lcd.print(")");

//Histereza Wilgotnościomierza
     
      int H = hum + 10;   
      if(h < hum )
      digitalWrite(relay1, LOW);
      else if (h >= H)
      digitalWrite(relay1, HIGH);
     

      /* <- UNCOMMENT THIS IF YOU NEED EXACT VALUES BUT COMMENT 5 LINES ABOVE
      if(h < hum )
      digitalWrite(relay1, LOW);
      else
      digitalWrite(relay1, HIGH);
      */


     
      if(t < temp )
      digitalWrite(relay2, LOW);
      else
      digitalWrite(relay2, HIGH);
 
 
  }
}
 
Odpowiedź
#2
Zła obsługa przycisków musiał byś flagi dodatkowo raczej dopisywać ..

Zrób zmienną by liczba odpowiadała ekranowi

lcd_key = read_LCD_buttons();

if(btnSELECT==5){
Ekran++
if(Ekran >= 6){ // ilość ekranów stron
ekran=0;
}
}

switch (Ekran){

case 0{

ekran pierwszy kod
}

case 1{
ekran drugi kod
}
}
itd..
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości