Bonjour,
j'ai écrit un code en m'inspirant de tuto et exemple pour créer un système télécommandé par infrarouge avec 4 relais pour monter descendre mon lit et mon dossier de lit.
Pourquoi ? Je suis tétraplégique et une fois couché je peux utiliser seulement une télécommande infrarouge et mon fabriquant de lit à arrêté de commercialisé ce produit qui au bout de 10ans a lâché (il en vendait pas assez m'a dit le représentant, sympa hein >:().
Du coup si une âme charitable veux bien me donner son avis sa serai très gentil, car c'est mon 1er programme Arduino alors je loupe certainement des trucs importants !
Comme pour millis();
La doc dit qu'elle revient à 0 après environ 50 jours, alors mon test vous parait bon pour cette éventualité ou elle revient à 0 alors qu'un relai est actif ? La je coupe, l'utilisateur devra relâcher le bouton et appuyer à nouveau, les probabilité que sa arrive sont faible je pense ... ?
Merci d'avance pour votre aide .
#include <IRremote.h> // libraries for get infrared code
#define DEBUG // for get debug informations
//#undef DEBUG // for production
//for led usage
#define LED_ON HIGH
#define LED_OFF LOW
#define null -1 // INT - used for check/set if a relay are active
//for relay usage
#define RELAY_ON HIGH
#define RELAY_OFF LOW
#define PIN_RELAY_BED_UP 4 // INT - relay PIN to activate for put bed up
#define PIN_RELAY_BED_DOWN 5 // INT - relay PIN to activate for put bed down
#define PIN_RELAY_BUST_UP 6 // INT - relay PIN to activate for put bust up
#define PIN_RELAY_BUST_DOWN 7 // INT - relay PIN to activate for put bust down
//for infrared usage
#define PIN_IR_RECV 2 // INT - infrared receveir PIN
#define TC_BED_UP 0x20FFEA15 // HEXADECIMAL - remote controller button code for bed going up
#define TC_BED_DOWN 0x20FF1AE5 // HEXADECIMAL - remote controller button code for bed going down
#define TC_BUST_UP 0x20FFAA55 // HEXADECIMAL - remote controller button code for bust bed going up
#define TC_BUST_DOWN 0x20FF6A95 // HEXADECIMAL - remote controller button code for bust bed going down
#define LOOP_DELAY 200 // MILLISECONDS - how much time we wait before check if a new command infrared are send by user
#define TIMEOUT_DELAY 500 // MILLISECONDS - i'm guessing here, this needs to be longer than the IR repeat intervalsend
#define INITIALIZATION_DELAY 4000 // MILLISECONDS - time to wait before end of initialization
IRrecv irReceiver(PIN_IR_RECV); // infrared receiver class
decode_results irResults; // for get result value
int relayOn = null; // we store active relay pin when user press button for put on/off
unsigned long lastButtonTime = millis(); // we store time when we see last time user press button, so we can know how much time since user release button
unsigned long actualButtonTime; // we store atual time - lastButtonTime for check if time are out and we need stop relay on
#ifdef DEBUG
#define DEBUG_PRINT(Str) Serial.print(Str)
#define DEBUG_PRINTLN(Str) Serial.println(Str)
#else
#define DEBUG_PRINT(Str)
#define DEBUG_PRINTLN(Str)
#endif
void setup() {
#ifdef DEBUG
Serial.begin(9600);
#endif
DEBUG_PRINTLN("Start initialization");
pinMode(LED_BUILTIN, OUTPUT); // we turn off on board led
digitalWrite(LED_BUILTIN, LED_OFF);
DEBUG_PRINTLN("Turned off onboard led");
//we set correct mode for relay and set them to off
DEBUG_PRINTLN("Set the relay off");
pinMode(PIN_RELAY_BED_UP, OUTPUT);
digitalWrite(PIN_RELAY_BED_UP, RELAY_OFF);
pinMode(PIN_RELAY_BED_DOWN, OUTPUT);
digitalWrite(PIN_RELAY_BED_DOWN, RELAY_OFF);
pinMode(PIN_RELAY_BUST_UP, OUTPUT);
digitalWrite(PIN_RELAY_BUST_UP, RELAY_OFF);
pinMode(PIN_RELAY_BUST_DOWN, OUTPUT);
digitalWrite(PIN_RELAY_BUST_DOWN, RELAY_OFF);
DEBUG_PRINTLN("All relay are off");
// in case the interrupt driver crashes on setup, give a clue
// to the user what's going on.
DEBUG_PRINTLN("Enabling Infrared");
irReceiver.enableIRIn(); // start the receiver
DEBUG_PRINTLN("Enabled Infrared");
delay(INITIALIZATION_DELAY); // check that all relays are inactive at Reset
DEBUG_PRINTLN("End initialization");
}
void loop()
{
if (irReceiver.decode(&irResults)) // if we have a code receveid
{
// we check if code received are a correct command
switch (irResults.value)
{
case TC_BED_UP: // user press button for make up the bed
relayOpen(PIN_RELAY_BED_UP);
break;
case TC_BED_DOWN: // user press button for make down the bed
relayOpen(PIN_RELAY_BED_DOWN);
break;
case TC_BUST_UP: // user press button for make up the bed bust
relayOpen(PIN_RELAY_BUST_UP);
break;
case TC_BUST_DOWN: // user press button for make down the bed bust
relayOpen(PIN_RELAY_BUST_DOWN);
break;
case REPEAT: // user continue press a button
if (relayOn != null) // if we have a relay already on it's a correct button user stay on
{
lastButtonTime = millis(); // update the time-out
}
break;
}
irReceiver.resume(); // receive the next value
}
// if a relay are on
// and millis() reset to 0 automatically when overflow, so if less than lastButtonTime we stop for prevent bug
// or turn off relay if time is out, user stop push button
actualButtonTime = millis(); // actual time since arduino start
if (relayOn != null && (actualButtonTime < lastButtonTime || (actualButtonTime - lastButtonTime) > TIMEOUT_DELAY))
{
relayClose();
}
delay(LOOP_DELAY);
}
void relayOpen(int relay)
{
relayClose(); // if a relay are on we stop it before set another on, bed cannot going up and down at same time...
relayOn = relay; // we save witch relay are now on
digitalWrite(relayOn, RELAY_ON); // we set relay on
lastButtonTime = millis(); // we keep time for check time out
relayStatePrint("on"); //we print witch relay are on
}
void relayClose()
{
// we check if a relay are on else nothing to do
if (relayOn != null)
{
digitalWrite(relayOn, RELAY_OFF); // we set to off relay actually on
relayStatePrint("off"); // we print witch relay are off before reset var because relayOn are used in function relayStatePrint
relayOn = null; // no more relay are on
}
}
void relayStatePrint(String state)
{
if (relayOn != null)
{
// we print relay state, ex: Relay bed up on
DEBUG_PRINT("Relay ");
switch (relayOn) // we check witch PIN are in relayOn var
{
case PIN_RELAY_BED_UP:
DEBUG_PRINT("bed up");
break;
case PIN_RELAY_BED_DOWN:
DEBUG_PRINT("bed down");
break;
case PIN_RELAY_BUST_UP:
DEBUG_PRINT("bust up");
break;
case PIN_RELAY_BUST_DOWN:
DEBUG_PRINT("bust down");
break;
}
DEBUG_PRINTLN(" " + state + ".");
}
else
{
DEBUG_PRINTLN("ERROR: No active relay found (relayOn are null).");
}
}