15-09-2020, 15:07
(Ten post był ostatnio modyfikowany: 15-09-2020, 15:10 przez neotorrent.)
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:
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;
}
}