Prepinani relé

Odpovědět
dimzone
Příspěvky: 18
Registrován: 23 bře 2020, 07:11
Reputation: 0

Prepinani relé

Příspěvek od dimzone » 23 bře 2020, 07:18

Zdravím mistři v arduino, mám dotaz. Chtěl bych ovládat jedním tlačítkem z dálkového ovladače 4 rele a to tak že po stisknutí patřičného tlačítka se sepne rele a po dalším stlačení přepne na druhé a tak následně až do jde na čtvrté a začne po dalším stisknutí sepnuti prvního a tak stále dokola. Děkuji moc za pomoc třeba jak by měl vypadat kód pro dvě rele.

Přikládám kód pro tlačítko

// Sketch: SwitchingThings_04a
//
// An example of using a single button switch to set multiple states or conditions
// Now using an array to store the LED pins
//
// Pins
// D10 to resister and green LED
// D9 to resister and yellow LED
// D8 to resister and red LED
// D2 to push button switch
//
// state holds the current status.
// 0 = all off.
// 1 = green LED
// 2 = yellow LED
// 3 = red LED

// Define the pins being used fro the LEDs
// green/yellow/red
char LED_Pins_array[] = { 10, 9, 8};

// Array to hold the LED sequence. green, yellow, red, yellow, green.
// position 0 is not used (considered not good practice but keeps the code easy to understand)
char LED_Sequence_array[] = { 10, 9, 8, 9};
byte squenceLength = 4;

int pin_switch = 2;

// variables to hold the new and old switch states
boolean oldSwitchState = LOW;
boolean newSwitchState1 = LOW;
boolean newSwitchState2 = LOW;
boolean newSwitchState3 = LOW;

byte state = -1;

void setup()
{
Serial.begin(9600);
Serial.print("Sketch: "); Serial.println(__FILE__);
Serial.print("Uploaded: "); Serial.println(__DATE__);
Serial.println(" ");

for (byte i=0; i< 3; i++)
{
pinMode(LED_Pins_array, OUTPUT); digitalWrite(LED_Pins_array,LOW);
}
pinMode(pin_switch, INPUT);
}

void loop()
{
newSwitchState1 = digitalRead(pin_switch);
delay(1);
newSwitchState2 = digitalRead(pin_switch);
delay(1);
newSwitchState3 = digitalRead(pin_switch);

// if all 3 values are the same we can continue
if ( (newSwitchState1==newSwitchState2) && (newSwitchState1==newSwitchState3) )
{
if ( newSwitchState1 != oldSwitchState )
{

// has the button switch been closed?
if ( newSwitchState1 == HIGH )
{

state++;
if (state > (squenceLength -1) ) { state = 0; }

// turn all LEDs off. Doing it this way means we do not need to care about the individual LEDs
// simply turn them all off and then turn on the correct one.
for (byte i=0; i< 3; i++)
{
digitalWrite(LED_Pins_array,LOW);
}

// Turn on the next LED
digitalWrite(LED_Sequence_array[state],HIGH);
}
oldSwitchState = newSwitchState1;
}
}
}



Místo tlačítka potřebuji jedno tlačítko na dálkovém ovladači. Jak zjistit kód tlačítka ovladače vím, ale už nevím jak to implementovat do kódu viz nahoře.

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Prepinani relé

Příspěvek od martinius96 » 23 bře 2020, 12:06

Otestované, funkčné.
Pridal som tam aj výpis, aby si videl kód, ktorý ten prijímač príjme, aby si si ho tam mohol doplniť.
Testoval som to na ovládači z LIDL-u --> SILVERCREST KH 2159, pri stlačení tlačidla hore striedavo vracal 820 a 20.
Urobil som podľa programu, ktorý som dal i na môj web už v minulosti s knižnicou IRremote.h a modulom KY-022. https://arduino.php5.sk/ir-rele.php
Pri držaní tlačidla vysiela rovnaký kód.

Kód: Vybrat vše

#include <IRremote.h> //hlavickovy subor pre senzor KY-022
const int LED_1 = 7;
const int LED_2 = 8;
const int LED_3 = 9;
const int LED_4 = 10;
const int RECV_PIN = 6;
IRrecv irrecv(RECV_PIN); //KY-022 na RECV VYVODE
decode_results results;
int value = 0;
void setup()
{
  Serial.begin(9600);
  Serial.println(" ");
  irrecv.enableIRIn(); //prijimaj signaly
  pinMode(LED_1, OUTPUT);
  pinMode(LED_2, OUTPUT);
  pinMode(LED_3, OUTPUT);
  pinMode(LED_4, OUTPUT);
  digitalWrite(LED_1, LOW);
  digitalWrite(LED_2, LOW);
  digitalWrite(LED_3, LOW);
  digitalWrite(LED_4, LOW);
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println("Nacitany kod kod: ");
    Serial.println(results.value, HEX);
    String abc = String(results.value, HEX);
    if ((abc == "820") || (abc == "20")) { //mozne hodnoty tlacidla (testovane na lidl ovladaci, jedno tlacidlo vratilo 820, alebo 20
      value++;
      switch (value) {
        case 1:
          digitalWrite(LED_1, HIGH);
          break;
        case 2:
          digitalWrite(LED_2, HIGH);
          break;
        case 3:
          digitalWrite(LED_3, HIGH);
          break;
        case 4:
          digitalWrite(LED_4, HIGH);
          break;
        default:
          // AK CHCEME LEDKY ZHASNUT....
          /* value = 0;
            digitalWrite(LED_1, LOW);
            digitalWrite(LED_2, LOW);
            digitalWrite(LED_3, LOW);
            digitalWrite(LED_4, LOW); */
          // AK NECHCEME LEDKY ZHASNUT....
          value = 1;
          digitalWrite(LED_1, HIGH);
          digitalWrite(LED_2, LOW);
          digitalWrite(LED_3, LOW);
          digitalWrite(LED_4, LOW);
          break;
      }
    }
    irrecv.resume(); // Povol nacitavanie dalsich hodnot
  }
  delay (250); // kratky delay, odrusenie citania chyb
}

dimzone
Příspěvky: 18
Registrován: 23 bře 2020, 07:11
Reputation: 0

Re: Prepinani relé

Příspěvek od dimzone » 23 bře 2020, 12:26

Ahoj děkuji za reakci, ale nějak mi to nefachčí do řádku jsem dal od co jsem načetl z ovladače co mám Serial.println("16712445"); ale to abc 820 a abc 20 to fakt nevím co s tím :-( žádná led nesvítí

#include <IRremote.h> //hlavickovy subor pre senzor KY-022
const int LED_1 = 7;
const int LED_2 = 8;
const int LED_3 = 9;
const int LED_4 = 10;
const int RECV_PIN = 6;
IRrecv irrecv(RECV_PIN); //KY-022 na RECV VYVODE
decode_results results;
int value = 0;
void setup()
{
Serial.begin(9600);
Serial.println(" ");
irrecv.enableIRIn(); //prijimaj signaly
pinMode(LED_1, OUTPUT);
pinMode(LED_2, OUTPUT);
pinMode(LED_3, OUTPUT);
pinMode(LED_4, OUTPUT);
digitalWrite(LED_1, LOW);
digitalWrite(LED_2, LOW);
digitalWrite(LED_3, LOW);
digitalWrite(LED_4, LOW);
}

void loop() {
if (irrecv.decode(&results)) {
Serial.println("16712445");
Serial.println(results.value, HEX);
String abc = String(results.value, HEX);
if ((abc == "820") || (abc == "20")) { //mozne hodnoty tlacidla (testovane na lidl ovladaci, jedno tlacidlo vratilo 820, alebo 20
value++;
switch (value) {
case 1:
digitalWrite(LED_1, HIGH);
break;
case 2:
digitalWrite(LED_2, HIGH);
break;
case 3:
digitalWrite(LED_3, HIGH);
break;
case 4:
digitalWrite(LED_4, HIGH);
break;
default:
// AK CHCEME LEDKY ZHASNUT....
/* value = 0;
digitalWrite(LED_1, LOW);
digitalWrite(LED_2, LOW);
digitalWrite(LED_3, LOW);
digitalWrite(LED_4, LOW); */
// AK NECHCEME LEDKY ZHASNUT....
value = 1;
digitalWrite(LED_1, HIGH);
digitalWrite(LED_2, LOW);
digitalWrite(LED_3, LOW);
digitalWrite(LED_4, LOW);
break;
}
}
irrecv.resume(); // Povol nacitavanie dalsich hodnot
}
delay (250); // kratky delay, odrusenie citania chyb
}

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Prepinani relé

Příspěvek od martinius96 » 23 bře 2020, 12:40

Skrátka doplníš do kódu namiesto
if ((abc == "820") || (abc == "20")) {
toto:
if (abc == "16712445") {

V tomto prípade načítavam HEX hodnotu.. je možné, že tú hodnotu máš z niečoho, kde si to načítaval predtým ako DEC hodnotu.
Otvor serial monitor a uvidíš, čo ti to vypíše.. to tam dosadíš. A bude to fungovať.

dimzone
Příspěvky: 18
Registrován: 23 bře 2020, 07:11
Reputation: 0

Re: Prepinani relé

Příspěvek od dimzone » 23 bře 2020, 12:47

Oukej jsem vocas :-) Akorát potřebuji ještě jednu věc, aby se to přepínalo. To jest první dioda se rozsvítí, zmačknu podruhé a první dioda zhasne a rozsvítí se druhá , zmačknu potřetí a druhá dioda zhasne a rozsvítí se třetí atd.

dimzone
Příspěvky: 18
Registrován: 23 bře 2020, 07:11
Reputation: 0

Re: Prepinani relé

Příspěvek od dimzone » 23 bře 2020, 12:52

Ok už to mám opravené :-) Díky za pomoc

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Prepinani relé

Příspěvek od martinius96 » 23 bře 2020, 12:53

Tak takto, len sa doplní k jednotlivým cases opačný stav (LOW) pre ostatné LED-ky, aby zhasli. ;)

Kód: Vybrat vše

#include <IRremote.h> //hlavickovy subor pre senzor KY-022
const int LED_1 = 7;
const int LED_2 = 8;
const int LED_3 = 9;
const int LED_4 = 10;
const int RECV_PIN = 6;
IRrecv irrecv(RECV_PIN); //KY-022 na RECV VYVODE
decode_results results;
int value = 0;
void setup()
{
  Serial.begin(9600);
  Serial.println(" ");
  irrecv.enableIRIn(); //prijimaj signaly
  pinMode(LED_1, OUTPUT);
  pinMode(LED_2, OUTPUT);
  pinMode(LED_3, OUTPUT);
  pinMode(LED_4, OUTPUT);
  digitalWrite(LED_1, LOW);
  digitalWrite(LED_2, LOW);
  digitalWrite(LED_3, LOW);
  digitalWrite(LED_4, LOW);
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println("Nacitany kod kod: ");
    Serial.println(results.value, HEX);
    String abc = String(results.value, HEX);
    if (abc == "16712445") {
      value++;
      switch (value) {
        case 1:
          digitalWrite(LED_1, HIGH);
          digitalWrite(LED_2, LOW);
          digitalWrite(LED_3, LOW);
          digitalWrite(LED_4, LOW);
          break;
        case 2:
          digitalWrite(LED_2, HIGH);
          digitalWrite(LED_1, LOW);
          digitalWrite(LED_3, LOW);
          digitalWrite(LED_4, LOW);
          break;
        case 3:
          digitalWrite(LED_3, HIGH);
          digitalWrite(LED_1, LOW);
          digitalWrite(LED_2, LOW);
          digitalWrite(LED_4, LOW);
          break;
        case 4:
          digitalWrite(LED_4, HIGH);
          digitalWrite(LED_1, LOW);
          digitalWrite(LED_2, LOW);
          digitalWrite(LED_3, LOW);
          break;
        default:
          // AK CHCEME LEDKY ZHASNUT....
          /* value = 0;
            digitalWrite(LED_1, LOW);
            digitalWrite(LED_2, LOW);
            digitalWrite(LED_3, LOW);
            digitalWrite(LED_4, LOW); */
          // AK NECHCEME LEDKY ZHASNUT....
          value = 1;
          digitalWrite(LED_1, HIGH);
          digitalWrite(LED_2, LOW);
          digitalWrite(LED_3, LOW);
          digitalWrite(LED_4, LOW);
          break;
      }
    }
    irrecv.resume(); // Povol nacitavanie dalsich hodnot
  }
  delay (250); // kratky delay, odrusenie citania chyb
}

dimzone
Příspěvky: 18
Registrován: 23 bře 2020, 07:11
Reputation: 0

Re: Prepinani relé

Příspěvek od dimzone » 23 bře 2020, 12:57

jjjj to už jsem udělal :-) S LCD už jsem měl tu čest dělat teploměr a ukazatel rádia takže teď už jen na LCD ukázat že led jedna je vstup AUX, druhá BT, třetí RÁDIO a čtvrtá PC :-)

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 6 hostů