/*attiny aig KATO ir
07/01/2024
Dominique Hudry
lien: https://github.com/LuisMiCa/IRsmallDecoder
https://wokwi.com/projects/386288346403032065
commande d'un aiguillage KATO codé par une télécommande IR NEC
-première touche: numéro de l'aiguillage. pour exemple aiguillage ayant comme code 0 ne réagira que pour l'appui de la touche 0 (48)
-seconde touche: position aiguillage
touche PREV: position DIRECT,
touche NEXT: position DEVIE
L'appui sur la touche Test allume toutes les leds durant une petite tempo.
touche code
télécde décimal
0 104
1 48
2 24
3 122
4 16
prev 224
next 144
test 34
Brochage ATtiny85
=|1 U 8|= VCC
CdeInput1 <--3 =|2 7|= 2<-- Sortie capteur IR
CdeInput2 <--4 =|3 6|= 1--> LedPosDirect
GND =|4 5|= 0--> LedPosDevie
Brochage L293D
+5V--Enable1 =|1 U 16|= VSS--+5V
CdeInput1--Input1 =|2 15|= Input4
bobine aiguillage R--Output1 =|3 14|= Output4
GND =|4 13|= GND
GND =|5 12|= GND
bobine aiguillage N--Output2 =|6 11|= Output3
CdeInput2--Input2 =|7 10|= Input3
+V aiguille--VS =|8 9|= Enable2
*/
const byte NumeroAig = 104; // correspond à 0 sur la télécommande
const byte LedPosDirect = 0; // pour indiquer la position Direct
const byte LedPosDevie = 1; // pour indiquer la position Dévié
const byte CdeInput1 = 3; // à relier à Input1 du L293D
const byte CdeInput2 = 4; // à relier à Input2 du L293D
const byte DureeImpulsion = 20;
bool selectAig = false; // valide la sélection correcte de l'aiguillage
byte etatLedPosDirect = 0; // État de la LED 1 (0 pour éteinte, 1 pour allumée)
byte etatLedPosDevie = 0; // État de la LED 2 (0 pour éteinte, 1 pour allumée)
#define IR_SMALLD_NEC
#include <IRsmallDecoder.h>
IRsmallDecoder irDecoder(2);
irSmallD_t irData;
void setup() {
pinMode(LedPosDirect, OUTPUT);
pinMode(LedPosDevie, OUTPUT);
pinMode(CdeInput1, OUTPUT);
pinMode(CdeInput2, OUTPUT);
digitalWrite(LedPosDirect, LOW);
digitalWrite(LedPosDevie, LOW);
digitalWrite(CdeInput1, LOW);
digitalWrite(CdeInput2, LOW);
} // fin setup
void loop() {
if (irDecoder.dataAvailable(irData)) {
traitementCode();
}
} // fin loop
void traitementCode() {
switch (irData.cmd) {
case NumeroAig: // Code décimal pour la première touche (sélection de l'aiguillage)
selectAig = true; // valide la bonne sélection de l'aiguillage
break;
case 144: // Code décimal pour la seconde touche (position Direct)
if (selectAig == true) {
etatLedPosDirect = HIGH;
etatLedPosDevie = LOW;
digitalWrite(CdeInput1, HIGH); // impulsion envoyée sur Input1
delay(DureeImpulsion);
digitalWrite(CdeInput1, LOW);
selectAig = false;
}
break;
case 224: // Code décimal pour la seconde touche (position Déviée)
if (selectAig == true) {
etatLedPosDirect = LOW;
etatLedPosDevie = HIGH;
digitalWrite(CdeInput2, HIGH); // impulsion envoyée sur Input2
delay(DureeImpulsion);
digitalWrite(CdeInput2, LOW);
selectAig = false;
}
break;
case 34: // Code décimal pour test
digitalWrite(LedPosDirect, HIGH);
digitalWrite(LedPosDevie, HIGH);
digitalWrite(CdeInput1, HIGH);
digitalWrite(CdeInput2, HIGH);
delay(1000);
digitalWrite(LedPosDirect, LOW);
digitalWrite(LedPosDevie, LOW);
digitalWrite(CdeInput1, LOW);
digitalWrite(CdeInput2, LOW);
selectAig = false;
break;
default:
// Si le code ne correspond à aucun bouton connu, ne rien faire
break;
} // fin switch case
affichagePosition(); // Appliquer la commande aux leds
} // fin traitementCode
void affichagePosition() {
digitalWrite(LedPosDirect, etatLedPosDirect);
digitalWrite(LedPosDevie, etatLedPosDevie);
} // fin affichagePosition