Skocz do zawartości

Odebranie Kodu Pilota IR jeden Przycisk dwie funkcje


Pomocna odpowiedź

Napisano

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;
       }}

 

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..

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;
  }
}

 

11 minut temu, _LM_ napisał:

@farmaceuta @Brendy ta biblioteka nie zwraca toggle bitu? To by ułatwiło oprogramowanie. 

nie mam zielonego pojecia...wlasnie ja pobieram zeby sprawdzic bo powinien ten przyklad dzialac ktory podalem..a co do negacji przekaznika to akurat pikus

#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
59 minut temu, farmaceuta napisał:

A pojedyncze klikniecie dziala? W mojej wersji..

Pojedyncze też nie dokładnie w tej wersji którą wysyałłeś. Nie mam nic na monitorze portu.

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 ?

(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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...