Liczba postów: 23
Liczba wątków: 5
Dołączył: Feb 2018
Reputacja:
0
Witam wszystkich
Mam pewien problem i nie wiem jak to ugryźć , potrzebuje zrobić coś takiego aby po naciścięciu jednego przycisku S1 zapalała się dioda D1 na określony czas , w tym czasie naciśnięcie przycisku S2 spowoduje zapalenie diody D2 także na określony czas ,następnie przycisk zostaje cały czas wcisnięty zapala się dioda D3 na określony czas , gdy dioda po upływie zadanego czasu zgasnie , zapala się dioda D4 także na określony czas , rozumiem że muszę wykorzystać kontrole stanu przycisku , i nie chciałbym używać funkcji delay tylko miils czy jest mi ktoś w stanie pomóc jak to wogóle zacząć
Liczba postów: 23
Liczba wątków: 5
Dołączył: Feb 2018
Reputacja:
0
Potrzebuje pomocy , ten Tinkercard to symulator , ale także trzeba pisać program prawda a ja nie wiem od czego zacząć
Liczba postów: 23
Liczba wątków: 5
Dołączył: Feb 2018
Reputacja:
0
napisałem takie coś ale wywala mi błąd
#define start 12
#define stop 8
#define led 7
#define s1 11
#define s0 9
#define led1 13
int Stato_LED;
int Stato_start;
int Stato_stop;
int Stato_LED1;
int Stato_s1;
int Stato_s0;
void setup()
{
pinMode(start, INPUT_PULLUP);
pinMode(stop, INPUT_PULLUP);
pinMode(led, OUTPUT);
pinMode(s1, INPUT_PULLUP);
pinMode(s0, INPUT_PULLUP);
pinMode(led1, OUTPUT);
}
void loop()
{
Stato_start = digitalRead(start);
Stato_stop = digitalRead(stop);
if (!Stato_stop) Stato_LED=LOW;
if (!Stato_start) Stato_LED=HIGH;
digitalWrite(led,Stato_LED);
Stato_s1 = digitalRead(S1);
Stato_s0 = digitalRead(s0);
if (!Stato_s1) Stato_LED=LOW;
if (!Stato_s0) Stato_LED=HIGH;
digitalWrite(led1,Stato_LED1);
}
Liczba postów: 170
Liczba wątków: 0
Dołączył: Dec 2021
Reputacja:
15
24-03-2022, 18:49
(Ten post był ostatnio modyfikowany: 24-03-2022, 18:52 przez MadMrQ.)
jeżeli tak napiszesz define to w Stato_s1 podstawi Stato_11
przy #define trzeba uważać i np. zamiast start zastosować zapis START_PIN - niepowtarzalny dla całego skeczu
dodatkowo w Stato_s1 = digitalRead(S1) masz dużą literę zamiast małej (s1)
Liczba postów: 23
Liczba wątków: 5
Dołączył: Feb 2018
Reputacja:
0
Poprawilem ale nadal nie o to mi chodzi , czytam artykuly o przyciskach i ledach ale nic nie kapuje
Liczba postów: 170
Liczba wątków: 0
Dołączył: Dec 2021
Reputacja:
15
otwórz sobie Arduino IDE, wybierz spośród przykładów 02. Digital > Button - tam jest wszystko - przycisk zapalający diodę
Liczba postów: 2,370
Liczba wątków: 0
Dołączył: Oct 2017
Reputacja:
240
Przykład użycia millis() masz w programie Arduino "BlinkWithoutDelay". I mnóstwo innych na tym forum.
Zamiast zatrzymywać program delay na określoną liczbę ms, by nie wykonywać czynności zbyt szybko zapisujesz sobie stan licznika z funkcji millis() i pozwalasz wykonywać się loop bez przeszkód, a pomijasz wykonywanie czynności, na które jeszcze czas nie nadszedł, sprawdzasz czy od poprzedniego użycia danego bloku programu upłynęła określona liczba ms i wtedy ponawiasz wykonanie.
Liczba postów: 76
Liczba wątków: 16
Dołączył: Sep 2021
Reputacja:
2
Czyli sprawdzanie czy nie nadszedł czas na wykonanie zadania wyglądałby np tak
tworzysz zmienne które przechowują dużą ilość liczb ponieważ millis w arduino rośnie wraz z upływem czasu od włączenia urządzenia dlatego najlepiej jest użyć zmiennie typu unsigned long a nie np int bo po około 30 sekunach zapełniła by się górna granica zmiennej int i program by stanął znaczy się ta funkcja. Wiec kawałek kodu wygladałby tak
unsigned long newTime;
unsigned long oldTime;
void loop (){
newTime = millis();
if(newTime - oldTime >= 1000){
//Twój blok który wykona się po określonym czasie np wyłączenie danej diody
oldTime = newTime;
}
}
w tym przypadku co sekunde będzie wykonywany kod zawarty w ifie tym samym kiedy program będzie odliczał 1000 ms może lecieć dalej
w dodatku jak chcesz kilka takich różnych ifów sprawdzających czy nie upłynął dany czas nie musisz tworzyć nowych zmiennych dla newTime tylko wystarczy oldTime2, oldTime3 itp itd