Arduino Polska Forum

Pełna wersja: hmm sam nie wiem:) licznik impulsów
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2
Witam wszystkich. Proszę o pomoc, jakich poleceń powinienem użyć aby załączyć przekaźnik na np 30s ( w sumie z tym poradzę Smile ale tylko pod warunkiem że, w ciagu np 5s wcisnę przełącznik 3 razy.
Pkt 1. Start programu.
Pkt 2. Sprawdź czy minęło 5 sekund? Jeżeli nie to wykonaj punkt 3. Jeżeli tak, punkt 1.
Pkt 3. Czy przełącznik został wciśnięty 3 razy? Jeżeli nie to wykonaj punkt 2. Jeżeli tak, punkt 4.
Pkt 4. Załącz przekaźnik na 30 sekund. Potem wykonaj punkt 1.

Konkretnych poleceń Ci nie podam ponieważ można to rozwiązać programistycznie na wiele sposobów.

Napisz kod i jak coś Ci nie wychodzi wtedy pytaj.
Tak to możemy sobie tylko powróżyć odnośnie rozwiązań problemu Smile

Pozdr.
ANT
ok coś zacznę kombinować i na pewno bede pytać:0
Poczytaj o warunkach if co to jest jak się zapisuje .
coś znalazlem w sumie to prawie całość tylko jesli zmieniam czas delay na dłuższy to nie włącza sie dioda

Kod:
const byte btnPin = 4,
         ledPin = 13,
         dbTime = 25; // debounce time
unsigned long timeStart, // debounce timer
            cntStart; //button press timer
const int timeOut = 5000; // 5 seconds
bool btn,
   oldBtn = false, // previous button state
   btnState = true,
   timing = false;
byte cnt = 0; // button press counter

void setup()
{
Serial.begin(9600);
pinMode(btnPin,INPUT_PULLUP);
pinMode(ledPin,OUTPUT);
}
void loop()
{
// first, debounce the button +++++++++++++++
if(digitalRead(btnPin) != btnState)
{
  timeStart = millis();
  btnState ^= 1;
}
if(millis() - timeStart > dbTime)
  btn = !btnState;
// end debounce +++++++++++++++++++++++++++++  
if(btn != oldBtn && btn == true) // if state changed and button is pressed
{
  if(!timing) // if first press, start timer
  {
    cntStart = millis();
    timing = true;
  }
if(++cnt > 2)
  digitalWrite(ledPin,HIGH); // press reset button to clear
delay(20000);
digitalWrite(ledPin, LOW);
Serial.println(cnt);  
}
oldBtn = btn;
if(millis() - cntStart > timeOut)
{
  cnt = 0;
  timing = false;
  cntStart = millis(); // reset counter and timer
}
}
jeśli delay wynosi 1000 ms to działa ale jeśli już jest 20000ms to nie działa
delay to zło w czystej postaci Smile poniżej masz kod z założeniami jakie podałeś w terminalu masz 3 liczby
czas oczekiwania na 3 naciśnięcia / ilość naciśnięć / czas pracy przekaźnika po załączeniu

program działa liniowo bez pętli i delay więc nie będzie wpływał na inne funkcje programu

Kod:
long cm;
long pm,pm_1;
long licznik;
byte start;
int stat,start_1;
byte czas_oczekiwania = 5;

void setup() {
  Serial.begin(9600);
pinMode(5, INPUT_PULLUP);
}

void loop() {
  
cm = millis()/1000;

if ( digitalRead(5) == HIGH )stat = 0;

if ( digitalRead(5) == LOW and stat == 0 )
    {start ++;stat = 1;pm = cm;}

if ( start > 0 ){
  if ((cm - pm) == 1){licznik ++;pm = cm;}}

if ( licznik > czas_oczekiwania and digitalRead(13) == 0 )
    {licznik = 0;start = 0;}
      
if ( start >= 3 )
    {digitalWrite(13,HIGH);}

if ( digitalRead(13) == HIGH ){
  licznik = 0;start = 0;
  if ((cm - pm_1) > 0){start_1 ++;pm_1 = cm;}
  if ( start_1 > 30 ){digitalWrite(13,LOW);start_1 = 0;}}

Serial.print(licznik);
Serial.print(" / ");
Serial.print(start);
Serial.print(" / ");
Serial.println(start_1);
}

posprzątałem lekko w kodzie
Po wgraniu podpięta dioda tylko się żarzyła, dodałem pinMode (12, OUTPUT); i zmieniłem {digitalWrite(12,HIGH);} i teraz po 3 wciśnięciach przycisku dioda zapala się z pełną mocą i świeci się cały czas aż wcisnę reset. JasQ bardzo dziękuje za kod i pomógłbyś jeszcze?
Bo na pinie 13 masz diodę na płytce Arduino dlatego dodatkowa Ci tylko jażyła.
dodaje delay po wlaczeniu diody jednak swieci się cały czas i nie gaśnie
Stron: 1 2