(03-11-2021, 22:18)dimetylo napisał(a): [ -> ] (03-11-2021, 12:46)Robson Kerman napisał(a): [ -> ]Czytaj przyciski i neguj stany na wyjściach ledów.
if (digitalRead(PRZYCISK1) == LOW) digitalWrite(LED1, !digitalRead(LED1);
Itd... itd...
Użyłem Twojego sposobu i działa jest tylko mały problem bez delay nie chce się włączyc z z funkcją delay włącza sie z opóźnieniem lub raz sie włączy a raz nie proszę pomóż
Kod:
void setup() {
pinMode( 8, INPUT);
pinMode( 9, INPUT);
pinMode( 10, INPUT);
pinMode( 11, INPUT);
pinMode( 2, OUTPUT);
pinMode( 3, OUTPUT);
pinMode( 4, OUTPUT);
pinMode( 5, OUTPUT);
}
void loop() {
if (digitalRead(8) == HIGH) digitalWrite((2), !digitalRead(2));
delay(250);
if (digitalRead(9) == HIGH) digitalWrite((3), !digitalRead(3));
delay(250);
}
Bo program mknie przez loop jak Usain Bolt przez tor
i zmienia stan diody zanim zauważysz.
Ale możesz się zastanowić jak to się dzieje, że gdy klikasz myszką komputera, to system nie zalicza tysięcy kliknięć tylko jedno i zrobić tak samo w swoim programie. Delaye nie załatwią problemu, tylko go pogłębią.
Naucz się odliczać czas korzystając z funkcji millis(), albo sprawdzaj czy przycisk został puszczony i dopiero wtedy pozwalaj na następną negację. Naucz się też eliminować drgania styków.
Bez delay wystarczy sprawdzać co np. 50 czy 100ms stan przycisku.
Kod:
uint32_t czasTeraz,czasPoprzedni,tik=10; //tik musi byc mniejszy niz 1000 i dzilic 1000ms na rowne czesci
uint8_t przycisk8=8,nTik,sekundy,minuty,godziny,dni; //liczniki tikow, sekund, itd.
bool fnTik,fsekundy,fminuty,fgodziny,fdni; //flagi zdarzen nowy tik, nowa sekunda,minuta, godzina, dzien
char napis[10];
uint8_t led1=LED_BUILTIN;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(led1,OUTPUT);
pinMode(przycisk8,INPUT_PULLUP);
}
void loop() {
// put your main code here, to run repeatedly:
czas();
if(fnTik and !(nTik%5==0)) //jesli w tym loop jest nowe 10ms i ich liczba jest podzielna przez 5, minelo 50ms
{
if (digitalRead(przycisk8) == LOW) digitalWrite(led1, !digitalRead(led1));//jesli zwarty do gnd odczytaj stan led i ustaw przeciwny
//pozostale przyciski
}
if(fsekundy) {
sprintf(napis,"%03d:%02d:%02d",godziny,minuty,sekundy);
Serial.println(napis);
}
}//koniec loop
void czas()
{
czasTeraz=millis();
fnTik=fsekundy=fminuty=fgodziny=fdni=0;
if((uint32_t)(czasTeraz-czasPoprzedni)>=tik) //tan napisany warunek jest odporny na "klątwe 50 dni millis()"
{
czasPoprzedni=czasTeraz;
fnTik=1;
nTik++;
if(nTik>=(1000/tik))
{
nTik=0;
sekundy++;
fsekundy=1;
if (sekundy>=60)
{
sekundy=0;
minuty++;
fminuty=1;
if (minuty>=60)
{
minuty=0;
godziny++;
fgodziny=1;
if (godziny>=24)
{
godziny=0;
fdni=1;
dni++;
}
}
}
}
}
}
Można sprawdzać co 10ms i zliczać czas wciśnięcia by zauważać nowe wciśnięcie i puszczenie, przytrzymanie przycisku, teraz jak ktoś przytrzyma to się będzie przełączał stan co 50ms, można też ten czas tak zmienić na 100ms, jest też kilka bibliotek, które robią to w podobny sposób (bounce2, buttons) i dają gotowe wartości.