Prepinani relé
Prepinani relé
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.
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.
-
- Příspěvky: 579
- Registrován: 01 srp 2017, 19:29
- Reputation: 0
- Bydliště: Poprad
- Kontaktovat uživatele:
Re: Prepinani relé
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.
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
}
Re: Prepinani relé
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
}
#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
}
-
- Příspěvky: 579
- Registrován: 01 srp 2017, 19:29
- Reputation: 0
- Bydliště: Poprad
- Kontaktovat uživatele:
Re: Prepinani relé
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ť.
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ť.
Re: Prepinani relé
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.
Re: Prepinani relé
Ok už to mám opravené Díky za pomoc
-
- Příspěvky: 579
- Registrován: 01 srp 2017, 19:29
- Reputation: 0
- Bydliště: Poprad
- Kontaktovat uživatele:
Re: Prepinani relé
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
}
Re: Prepinani relé
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
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host