• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Zmiana stanu przekaźników jednym guzikiem - OneButton
#1
Znowu mam problem, i mam nadzieję że przez jakąś głupotę a  nie kompletnie odwrotne myślenie Smile


Może najpierw nakreślę co chciałbym by mój program robił, biblioteka która mi pomaga to OneButton:
  1. Klikam guzik - załącza się przekaźnik 1
  2. Klikam guzik ponownie - załącza się przekaźnik 2, a wyłącza 1:
    a) W tym trybie jak przytrzymam guzik 1, załączy się przekaźnik 3, 1 i 2 się wyłączy i wróci do trybu 2.
  3. Klikam guzik ponownie - wyłączają się wszystkie przekaźniki
Kod:
#include "OneButton.h"
#define guzik   13
#define rel     5
#define rel2    6
#define rel3    7



OneButton start(13, true);

typedef enum {
 ACTION_OFF,
 ACTION_1,
 ACTION_2,
}
MyActions;

MyActions nextAction = ACTION_OFF;



void setup() {

 Serial.begin(9600);
 pinMode(guzik, INPUT_PULLUP);
 pinMode(rel, OUTPUT);
 pinMode(rel2, OUTPUT);
 pinMode(rel3, OUTPUT);
 digitalWrite(rel, HIGH);
 digitalWrite(rel2, HIGH);
 digitalWrite(rel3, HIGH);


 start.attachClick(click1);
 start.attachDuringLongPress(longPress1);
 start.setDebounceTicks(50);
}


void loop() {
 // keep watching the push buttons:
 start.tick();
 
if (nextAction == ACTION_OFF) {

 digitalWrite(rel, HIGH);
 digitalWrite(rel2, HIGH);
 digitalWrite(rel3, HIGH);
 }
 
else if (nextAction == ACTION_1) {

   digitalWrite(rel, HIGH);
   digitalWrite(rel2, LOW);
   digitalWrite(rel3, HIGH);
 }
 
else if (nextAction == ACTION_2) {
 digitalWrite(rel, LOW);
 digitalWrite(rel2, LOW);
 digitalWrite(rel3, HIGH);
   }
}






void click1() {
   if (nextAction == ACTION_OFF) {
   nextAction = ACTION_1;

   }
   else if  (nextAction == ACTION_1) {
     nextAction == ACTION_2;

   }
       else if  (nextAction == ACTION_2) {
     nextAction == ACTION_OFF;

   }
}


void longPress1 () {
 if (nextAction == ACTION_2) {
 digitalWrite(rel, HIGH);
 digitalWrite(rel2, HIGH);
 digitalWrite(rel3, LOW);  
 }
}
void doubleclick1() {
nextAction == ACTION_OFF;

}
Gdzie popełniam karygodny błąd ? Smile
Przekaźniki są sterowane stanem niskim jakby co.
 
Odpowiedź
#2
Ok trochę poprawiłem, działa niby tak jakbym chciał ale..... case 2 trzyma dwa przekaźniki właczonone, gdy longpress stara się je wyłączyć na ten czas...... da się to sprytnie obejść by nie wykluczały się obie zależności ?

Kod:
#include "OneButton.h"
#define immo   12
#define guzik   13
#define rel     5
#define rel2    6
#define rel3    7

byte A = 0;

OneButton start(13, true);


void setup() {

  Serial.begin(9600);
  pinMode(immo, INPUT_PULLUP);
  pinMode(guzik, INPUT_PULLUP);
  pinMode(rel, OUTPUT);
  pinMode(rel2, OUTPUT);
  pinMode(rel3, OUTPUT);
  digitalWrite(rel, HIGH);
  digitalWrite(rel2, HIGH);
  digitalWrite(rel3, HIGH);


  start.attachClick(click1);
  start.attachDuringLongPress(longPress1);
  start.setDebounceTicks(50);
}


void loop() {
  // keep watching the push buttons:
  start.tick();
  delay(1);
  
  
  if (digitalRead(immo) == HIGH ) {
    digitalWrite(rel, HIGH);
    digitalWrite(rel2, HIGH);
    digitalWrite(rel3, HIGH);
    A = A*0;
  }
  
  switch (A) {

  case 1:
    digitalWrite(rel, HIGH);
    digitalWrite(rel2, LOW);
    digitalWrite(rel3, HIGH);
  break;

  
  case  2:
    digitalWrite(rel, LOW);
    digitalWrite(rel2, LOW);
    digitalWrite(rel3, HIGH);
  break;

  case  3:
    digitalWrite(rel, HIGH);
    digitalWrite(rel2, HIGH);
    digitalWrite(rel3, HIGH);
    A = A*0;
    }
}

void click1() {
A = A+1;
}


void longPress1 () {
  if ( A = 2 ) {
  digitalWrite(rel, HIGH);
  digitalWrite(rel2, HIGH);
  digitalWrite(rel3, LOW);   
  }
 
}
 
Odpowiedź
#3
Kolego bullseye czemu sam nie napiszesz programu a używasz czyjegoś i nie jest dla Ciebie zrozumiały
Na początek ustaw
1 wejście przycisk
2 wyjścia LOW
z tego co wyczytałem to masz tylko 3 kombinacje
00
10
01
teraz poczytaj o warunkach (if)tu wystarczą prawdziwe
1 warunek
if
jeżeli przycisk jest wciśnięty a wyjście 1 ma stan niski a 2 niski
to wyjście 1 daj na stan wysoki a 2 niski
odczekaj 2s

2 warunek
if
jeżeli przycisk jest wciśnięty a wyjście 1 ma wysoki a 2 niski
to wyjście 1 daj na stan niski a 2 wysoki
odczekaj 2s
i trzeci warunek
 
Odpowiedź
#4
Pozwolę sobie rozszerzyć wypowiedź bob35, choć właściwie niczego nowego specjalnie nie wniosę.
W logice cyfrowej znane są trzy podstawowe działania: suma logiczna (lub, or), iloczyn logiczny (i, and) oraz negacja logiczna (not).
Każdy wynik działania logicznego zawiera się w takim samym zbiorze ({0,1}), jak każdy z sygnałów wchodzących w skład działania.
Poszczególne działania przedstawia się najczęściej w tabelach prawdy:

A B A or B A and B
0 0 0 0
0 1 1 0
1 0 1 0
1 1 1 0

Negacja jest odwróceniem wartości sygnału:

A not A
0 1
1 0

W arduino (i w ogóle, w programowaniu) wykorzystuje się to najczęściej przy warunkach. Dla przykładu, if:
Kod:
if((warunek1) or (warunek2)) {
kod
}

if((wartosc1==0) and (analogRead(A0)>100)){
kod
}

stan_czujnika=!(digitalRead(7));

Ostatnia linia kodu ustawia wartość zmiennej stan_czujnika jako odwrotną do stanu pinu 7.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości