• 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
Menu sterowane enkodrem
#1
Cześć wszystkim,

Zrobiłem hobbistycznie urządzono które nalewa whisky lub whisky z colą do szklanki.
Generalnie wszystko działa, ale mój kod jest dość toporny jest kilka negatywnych efektów.
1. LCD troche mrugą domyślalm się ze jest to spowodowane wyświetlaniem w pętli.
2. Enkoder jest dość czuły i czasami menu przelatuje za szybko

Jeżeli ktoś chciałby zoptymalizować mój kod będę wdzięczny:


Kod:
#include <Wire.h>
#include <LiquidCrystal.h> //Dołączenie bilbioteki
LiquidCrystal lcd(5, 6, 7, 8, 9, 10); //Informacja o podłączeniu nowego wyświetlacza


#define przycisk 1
#define clk 2
#define dt 3
#define sw 4
#define switch1 11
#define switch2 12
#define switch3 13

volatile boolean TurnDetected;
volatile boolean up;
boolean klik = 0;
boolean doit = 0;
int pos_menu = 0;
int pos_menu_2 = 0;
int liczba_pos_menu = 2;
int ustawienie = 0;
int poziom_menu = 0;


void isr0 ()  {
  TurnDetected = true;
  up = (digitalRead(clk) == digitalRead(dt));
}

void setup() {
  pinMode(clk, INPUT);
  pinMode(dt, INPUT);
  pinMode(sw, INPUT_PULLUP);
  pinMode(switch1, OUTPUT);
  pinMode(switch2, OUTPUT);
  pinMode(switch3, OUTPUT);
  attachInterrupt (0, isr0, RISING);
  lcd.begin(16, 2);
  pinMode(przycisk, INPUT);        
 

}

void loop() {
  klik = 0;
  digitalWrite(switch1, HIGH);
  digitalWrite(switch2, HIGH);
  digitalWrite(switch3, LOW);
  int odczyt = digitalRead(przycisk); //Odczyt stanu przycisku do zmiennej lokalnej
  if (odczyt == LOW){
    digitalWrite(switch1, LOW);
    digitalWrite(switch2, LOW);
  }


if (TurnDetected) {
    delay(200);
      if (up) {
         pos_menu++;
         pos_menu_2++;
         if (pos_menu>liczba_pos_menu){
          pos_menu = liczba_pos_menu;
         }
         if (pos_menu_2>1){
          pos_menu_2 = 1;
         }
       
      }
      else {
        pos_menu--;
        pos_menu_2--;
          if (pos_menu<0){
          pos_menu = 0;
         }
         if (pos_menu_2<0){
          pos_menu_2 = 0;
         }
    }
    TurnDetected = false;
  }

if (digitalRead(sw) == LOW) {
    delay(200);
    klik = 1;
  }

if (pos_menu == 0 && poziom_menu == 0) {
    lcd.clear();
    lcd.print("CZYSTA WHISKY");
    lcd.setCursor(0,1);
    lcd.print("50ml");
    delay(200);
    if (klik == 1){
      poziom_menu = 1;
      ustawienie = 1;
      doit = 0;
    }
    delay(100);
  
  }
else if (pos_menu == 1 && poziom_menu == 0) {
    lcd.clear();
    lcd.print("WHISKY + COLA");
    lcd.setCursor(0,1);
    lcd.print("50ml + 100ml");
    delay(200);
    if (klik == 1){
      poziom_menu = 1;
      ustawienie = 2;
      doit = 0;
    }
    delay(100);
  }

else if (pos_menu == 2 && poziom_menu == 0) {
    lcd.clear();
    lcd.print("CZYSZCZENIE");
    lcd.setCursor(0,1);
    lcd.print("URZADZENIA");
    delay(200);
    if (klik == 1){
      poziom_menu = 1;
      ustawienie = 3;
      doit = 0;
    }
    delay(100);
  }

else if (pos_menu_2 == 0 && poziom_menu == 1) {
    lcd.clear();
    lcd.print("ZATWIERDZ");
    if (klik == 1){
      doit = 1;
    }
    delay(100);
  }
else if (pos_menu_2 == 1 && poziom_menu == 1) {
    lcd.clear();
    lcd.print("COFNIJ");

    if (klik == 1){
      poziom_menu = 0;
      ustawienie = 0;
      doit = 0;
    }
    delay(100);
  }

if (doit == 1 && ustawienie == 1){
  lcd.clear();
  lcd.print("ROBIE");
  lcd.setCursor(0,1);
  lcd.print("CZYSTA WHISKY");
  digitalWrite(switch1, LOW);
  delay(35000);
  lcd.clear();
  lcd.setCursor(4,0);
  lcd.print("SMACZNEGO");
  delay(2000);
  poziom_menu = 0;
  ustawienie = 0;
  doit = 0;

 
}

else if (doit == 1 && ustawienie == 2){
  lcd.clear();
  lcd.print("ROBIE");
  lcd.setCursor(0,1);
  lcd.print("WHISKY Z COLA");
  digitalWrite(switch1, LOW);
  digitalWrite(switch2, LOW);
  delay(35000);
  digitalWrite(switch1, HIGH);
  delay(40000);
  digitalWrite(switch2, HIGH);
  lcd.clear();
  lcd.setCursor(4,0);
  lcd.print("SMACZNEGO");
  delay(2000);
  poziom_menu = 0;
  ustawienie = 0;
  doit = 0;
}


else if (doit == 1 && ustawienie == 3){
  lcd.clear();
  lcd.print("ROBIE");
  lcd.setCursor(0,1);
  lcd.print("CZYSZCZENIE");
  digitalWrite(switch1, HIGH);
  digitalWrite(switch2, HIGH);
  digitalWrite(switch3, HIGH);
  delay(5000);
  lcd.clear();
  lcd.setCursor(4,0);
  lcd.print("ZROBIONE");
  delay(2000);
  poziom_menu = 0;
  ustawienie = 0;
  doit = 0;

}


 

}
 
Odpowiedź
#2
No z takim delay-mi to nic dziwnego że to ledwo działa..
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości