Arduino Polska Forum
Pomoc w kodzie - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Piaskownica (https://forum.arduinopolska.pl/dzial-piaskownica)
+--- Wątek: Pomoc w kodzie (/watek-pomoc-w-kodzie--4205)



Pomoc w kodzie - Przemek89 - 01-11-2021

Witam dopiero się uczę potrzebuję zmienić przycisk aby włączał stoper kiedy jest wciśnięty a zatrzymywał i resetował kiedy jest puszczony
//#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#define button 1
int buttonPushCounter = 0;     
bool bPress = false;
int nalewaki = 6;
int timerMode = 0;
long startTime;
long stopTime;
LiquidCrystal_I2C lcd(0x27,20,4);
void setup(){
lcd.init();
lcd.backlight(); 
lcd.begin(16, 2);
lcd.clear();
pinMode(button, INPUT_PULLUP);
lcd.print("Stoper:");
}
void loop(){           
lcd.setCursor(16, 2);
if (digitalRead(button) == LOW){
startTime = millis();
timerMode++;
delay(400);
}
if (timerMode == 1){
lcd.setCursor(7, 0);
lcd.print((millis() - startTime) / 1000.0);
}
if (timerMode > 1){
delay(2000);
timerMode = 0;
lcd.clear();
lcd.print("Stoper:");
}
}


RE: Pomoc w kodzie - mateuszmilke97@gmail.com - 01-11-2021

Spróbuj pod pierwszym ifem w loop dać else i tam instrukcje do resetowania licznika i wyświetlania 0 na wyświetlaczu

if (digitalRead(button) == LOW){
startTime = millis();
timerMode++;
delay(400);
}
else { //czyli jak powyższy argument dotyczący włącznika nie zostanie spełniony
timerMode = 0;
//i inne instrukcje związane z obsługą kiedy przycisk nie jest wciśnięty
}


tyle mogę podpowiedzieć bo nie wiem za dużo o funkcjonalności Twojego programu


RE: Pomoc w kodzie - kaczakat - 04-11-2021

Funkcjonalność jest taka, że tworzysz strasznego gniota. Zacznij od nauczenia się obliczenia ilości "upłyniętych" dziesiątek ms, w tym tygodniu wstawiałem taki przykładowy program już dwa razy. Sprawdzanie czy coś jest wciśnięte można robić w każdym obiegu loop, co określony czas, albo na przerwanie, jeszcze lepiej biblioteką, ale reszta programu musi mieć sens by użyć biblioteki - bez delay, natomiast próba wysyłania czegoś co każdy obieg loop przez I2C na ekran to porażka. Można zrobić bufor w pamięci na obejmujący taki przykładowy napis stopera "00:00:00" i w nim ewentualnie podmieniać znaki co 1/100s, wysyłać taki napis cyklicznie na ekran, ale wysyłanie tego napisu na ekran częściej niż 100ms nie ma większego sensu, ten ekran jest za wolny, a Ty jeszcze go czyścisz cały i zapisujesz od nowa, to trwa z 40ms. W opcji gdy jest wyłączony przez 2s nie zauważy w ogóle wciśniętego przycisku - delay(2000). Finalnie jak wszystko się uda zgodnie z tym planem to będzie zapisywał losowy start i stop, a ekran będzie głównie migotał.