140 lines
4.1 KiB
C++
Executable File
140 lines
4.1 KiB
C++
Executable File
byte pin=2;
|
|
boolean bit2[26];// nom de la telecommande
|
|
boolean bit2Interruptor[4];//code interrupteur telecommande
|
|
// a partir d'ici on = 1 off = 0
|
|
void setup()
|
|
{
|
|
Serial.begin(9600);
|
|
buildBool(68,bit2,sizeof(bit2));
|
|
buildBool(1,bit2Interruptor,sizeof(bit2Interruptor));
|
|
|
|
}
|
|
void loop()
|
|
{
|
|
if(Serial.available()>0)
|
|
{char val = Serial.read();
|
|
if(val=='1')
|
|
{
|
|
transmit(1,pin,bit2,bit2Interruptor);
|
|
delay(300);
|
|
transmit(1,pin,bit2,bit2Interruptor);
|
|
delay(300);
|
|
transmit(1,pin,bit2,bit2Interruptor);
|
|
delay(300);
|
|
transmit(1,pin,bit2,bit2Interruptor);
|
|
delay(300);
|
|
Serial.println("on");
|
|
}
|
|
if(val =='0')
|
|
{
|
|
transmit(0,pin,bit2,bit2Interruptor);
|
|
delay(300);
|
|
transmit(0,pin,bit2,bit2Interruptor);
|
|
delay(300);
|
|
transmit(0,pin,bit2,bit2Interruptor);
|
|
delay(300);
|
|
transmit(0,pin,bit2,bit2Interruptor);
|
|
delay(300);
|
|
Serial.println("off");
|
|
}
|
|
}
|
|
}
|
|
|
|
/*prend en arguement un integer, un tableau et ça longueur-1 ( cad que tab[26] à pour longueur 26 et non 27).C'est pour facilité l'emploi de sizeof
|
|
* théoriquement, il faudrait donc marquer ( interger, array,sizeof(array) )
|
|
* retourne un tableau de boolean avec le nombre integer en binaire
|
|
*/
|
|
|
|
void buildBool(long integer,boolean array[],byte length){
|
|
Serial.println("entering buildBool");
|
|
for(int i = 0; integer!=0 ;i++){
|
|
if(integer<pow(2,i)){
|
|
array[length-i]=1;
|
|
integer = integer-(pow(2,(i-1)));
|
|
i = 0;
|
|
}
|
|
}
|
|
|
|
}
|
|
//Envois d'une pulsation (passage de l'etat haut a l'etat bas)
|
|
//1 = 310µs haut puis 1340µs bas
|
|
//0 = 310µs haut puis 310µs bas
|
|
void sendBit(boolean b,byte pin) {
|
|
if (b) {
|
|
digitalWrite(pin, HIGH);
|
|
delayMicroseconds(310); //275 orinally, but tweaked.
|
|
digitalWrite(pin, LOW);
|
|
delayMicroseconds(1340); //1225 orinally, but tweaked.
|
|
}
|
|
else {
|
|
digitalWrite(pin, HIGH);
|
|
delayMicroseconds(310); //275 orinally, but tweaked.
|
|
digitalWrite(pin, LOW);
|
|
delayMicroseconds(310); //275 orinally, but tweaked.
|
|
}
|
|
}
|
|
|
|
|
|
//Envoie d'une paire de pulsation radio qui definissent 1 bit réel : 0 =01 et 1 =10
|
|
//c'est le codage de manchester qui necessite ce petit bouzin, ceci permet entre autres de dissocier les données des parasites
|
|
void sendPair(boolean b,byte pin) {
|
|
if(b)
|
|
{
|
|
sendBit(true,pin);
|
|
sendBit(false,pin);
|
|
}
|
|
else
|
|
{
|
|
sendBit(false,pin);
|
|
sendBit(true,pin);
|
|
}
|
|
}
|
|
|
|
|
|
//Fonction d'envois du signal
|
|
//recoit en parametre un booleen définissant l'arret ou la marche du matos (true = on, false = off)
|
|
void transmit(boolean onOff,byte pin,boolean bit2[],boolean bit2Interruptor[])
|
|
{
|
|
int i;
|
|
|
|
// Sequence de verrou anoncant le départ du signal au recepeteur
|
|
digitalWrite(pin, HIGH);
|
|
delayMicroseconds(275); // un bit de bruit avant de commencer pour remettre les delais du recepteur a 0
|
|
digitalWrite(pin, LOW);
|
|
delayMicroseconds(9900); // premier verrou de 9900µs
|
|
digitalWrite(pin, HIGH); // high again
|
|
delayMicroseconds(275); // attente de 275µs entre les deux verrous
|
|
digitalWrite(pin, LOW); // second verrou de 2675µs
|
|
delayMicroseconds(2675);
|
|
digitalWrite(pin, HIGH); // On reviens en état haut pour bien couper les verrous des données
|
|
|
|
// Envoie du code emetteur (272946 = 1000010101000110010 en binaire)
|
|
for(i=0; i<26;i++)
|
|
{
|
|
sendPair(bit2[i],pin);
|
|
}
|
|
|
|
// Envoie du bit définissant si c'est une commande de groupe ou non (26em bit)
|
|
sendPair(false,pin);
|
|
|
|
// Envoie du bit définissant si c'est allumé ou eteint 27em bit)
|
|
sendPair(onOff,pin);
|
|
|
|
// Envoie des 4 derniers bits, qui représentent le code interrupteur, ici 0 (encode sur 4 bit donc 0000)
|
|
// nb: sur les télécommandes officielle chacon, les interrupteurs sont logiquement nommés de 0 à x
|
|
// interrupteur 1 = 0 (donc 0000) , interrupteur 2 = 1 (1000) , interrupteur 3 = 2 (0100) etc...
|
|
for(i=0; i<4;i++)
|
|
{
|
|
if(bit2Interruptor[i]==0){
|
|
sendPair(false,pin);
|
|
}else{
|
|
sendPair(true,pin);
|
|
}
|
|
}
|
|
|
|
digitalWrite(pin, HIGH); // coupure données, verrou
|
|
delayMicroseconds(275); // attendre 275µs
|
|
digitalWrite(pin, LOW); // verrou 2 de 2675µs pour signaler la fermeture du signal
|
|
|
|
}
|