Skocz do zawartości

Odebranie Kodu Pilota IR jeden Przycisk dwie funkcje


Brendy

Pomocna odpowiedź

Witam 

Czy mógłby ktoś pomoc przy kodzie nie wiem jak to napisać.

Po odberaniu kodu z pilota chciałbym żeby 1 klik na pilocie włączył/wyłączył pierwszy przekaźnik i 2x klik włączył/wyłączył drugi przekaźnik żeby to działało nie zależnie. 

#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRutils.h>

const uint16_t kRecvPin = 14;  // PIN DATA IR
IRrecv irrecv(kRecvPin);
decode_results results;

#define KOD_IR 551519865

int b = 0;

unsigned long czas;


void setup() {
    Serial.begin(9600);
    irrecv.enableIRIn();  // Start  IR
}

void loop() {

int Odczytany_kod;

  if (irrecv.decode(&results)) {
    Odczytany_kod = (results.value);
    if (Odczytany_kod == KOD_IR) {
      b++;
      czas = millis();

      delay(200);
    } if (Odczytany_kod == KOD_IR && b==1) {
      Serial.print("-- 1x Klik: ");
      Serial.println("Przekaźnik Pierwszy");
      delay(100);
    }
    else if(Odczytany_kod == KOD_IR && b==2) {
       Serial.print("-- 2x Klik: ");
       Serial.println("Przekaźnik Drugi");
      delay(100);
    }
    irrecv.resume();  // Receive the next value
    delay(50);
  }
       if (millis() - czas >= 1500) { // zerowanie licznika.
     b=0;
       }}

 

Link do komentarza
Share on other sites

Dobrze kombinowales, tylko taka poprawka ze nie mozesz sprawdzac warunkow od przekaznikow zaraz po b++...bo zawsze najpierw wystartuje if pierwszy... 

void loop() {
static byte flaga = 0;
static byte stan = 0;
  
int Odczytany_kod = 0;

  if (irrecv.decode(&results)) {
    Odczytany_kod = (results.value);
    if (Odczytany_kod == KOD_IR) {
      flaga++;
      czas = millis();
      delay(200);
    } 
  }
    if (stan == 1) {
      Serial.print("-- 1x Klik: ");
      Serial.println("Przekaźnik Pierwszy");
      delay(100);
    }
    else if(stan == 2) {
       Serial.print("-- 2x Klik: ");
       Serial.println("Przekaźnik Drugi");
      delay(100);
      
    }
    irrecv.resume();  // Receive the next value
    delay(50);
 
     stan = 0;
       if (millis() - czas >= 1500) { // zerowanie licznika.
    if (flaga == 1) { 
     stan = 1;
    } 
    if (flaga == 2) { 
     stan = 2;
    }
     flaga = 0;
       } 
 }

Powinno dzialac tak jak chcesz..

Link do komentarza
Share on other sites

Dziękuje za podpowiedź, wgrałem program ale nie działa dwuklik nie działa. Zrobiłem coś takiego krótkie przytrzymanie włącza pierwszy przekaźnik, dwuklik włącza drugi i działa bardzo stabilnie,  ale nadal nie wiem jak zrobić przerwę miedzy klikami.  1 klik- pierwszy przekaznik On/Off, 2 klik - drugi On/Off, , przytrzymaanie przycisku wyłącz dwa przekaźniki jeśli są dwa włączone

#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRutils.h>

const uint16_t kRecvPin = 14;  // PIN DATA IR
IRrecv irrecv(kRecvPin);
decode_results results;

#define KOD_IR 551519865

uint8_t klik_x1 = 0;
uint8_t klik_x2 = 0;
uint8_t licznik_klikniec = 0;
bool flaga = false;

unsigned long Czas_Zerowania_Licznika;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();  // Start  IR
}

void loop() {


  int Odczytany_kod;

  if (irrecv.decode(&results)) {
    Odczytany_kod = (results.value);
    if (Odczytany_kod == KOD_IR) {

      licznik_klikniec++;
      Czas_Zerowania_Licznika = millis();
      flaga = true;
    }
    if ( flaga == true &&  millis() - Czas_Zerowania_Licznika > 300) {

      if (licznik_klikniec == 1 && klik_x1 == 0) {
        klik_x1 = 1;
        Serial.print("-- 1x Klik: ");
        Serial.println("Przekaźnik Pierwszy");
      }
    }
    else if (licznik_klikniec == 2 && klik_x2 == 0  ) {
      klik_x2 = 1;
      Serial.print("-- 2x Klik: ");
      Serial.println("Przekaźnik Drugi");
    }
    irrecv.resume();  // Receive the next value
    delay(50);
  }
  if (millis() - Czas_Zerowania_Licznika >= 1000) { // zerowanie licznika.
    licznik_klikniec = 0;
    flaga = false;
    klik_x1 = 0;
    klik_x2 = 0;
  }
}

 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

#include <IRremote.h>

const uint16_t kRecvPin = 2;  // PIN DATA IR
IRrecv irrecv(kRecvPin);
decode_results results;

#define KOD_IR -2041

int b = 0;

unsigned long czas;


void setup() {
    Serial.begin(9600);
    irrecv.enableIRIn();  // Start  IR
    pinMode(3, OUTPUT);
    pinMode(4, OUTPUT);
    digitalWrite(3, LOW);
    digitalWrite(4,HIGH);
}

void loop() {
static byte flaga = 0;
static byte stan = 0;
  
int Odczytany_kod = 0;

  if (irrecv.decode(&results)) {
    Odczytany_kod = (results.value);
    Serial.print(Odczytany_kod);
    if (Odczytany_kod == KOD_IR) {
      flaga++;
      czas = millis();
      }
    irrecv.resume(); 
  }
    if (stan == 1) {
      Serial.print("-- 1x Klik: ");
      Serial.println("Przekaźnik Pierwszy");
      delay(100);
      stan = 0;
    }
    else if(stan == 2) {
       Serial.print("-- 2x Klik: ");
       Serial.println("Przekaźnik Drugi");
      delay(100);
      stan = 0;
    }
      
 
     
       if (millis() - czas >= 1500) { // zerowanie licznika.
    if (flaga == 1) { 
     stan = 1;
    } 
    if (flaga == 2) { 
     stan = 2;
    }
     flaga = 0;
       } 
 }

juz dziala...problemem byla ta linijka

irrecv.resume(); 

musi byc wywolana tylko raz podczas odbierania pakietu

  • Pomogłeś! 1
Link do komentarza
Share on other sites

farmaceuta bardzo dziękuje działa pięknie co fachowiec to fachowiec:) ja się z tym tyle męczyłem.

Czy dałoby radę dopisać jeszcze jak dwa przekaźniki włączone to przytrzymanie wyłącz dwa ?

Link do komentarza
Share on other sites

(edytowany)

dokladnie tak mam później jak wcisnąłem przycisk i tzymałem to jeden raz kod i potem 1111

551519865-1-- 1x Klik: Przekaźnik Pierwszy
551519865551519865-1-- 2x Klik: Przekaźnik Drugi
551519865-1-1-1-1-1-1-1-1-1-- 1x Klik: Przekaźnik Pierwszy
-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1

Edytowano przez Brendy
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.