Go Down

Topic: Arduino Infrarouge, relais pour télécommande de lit sans fil (Read 575 times) previous topic - next topic

alexandrev

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 :smiley-kiss:.

Code: [Select]
#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).");    
  }
}


artouste2

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 >:().
Bonsoir
ne te polarise  pas sur un eventuel debordement de millis()
Dans ton cas , je pense qu'il est surtout primordial de connaitre "le vrai probleme de ton lit"
- Le recepteur IR de ton lit , ne reagit plus ?
- La partie puissance ?
- Ta telco émet correctement ? (je suppose puisque ton code "embarque" des codes récupérés )
- Tu a de la doc (liens ? ) vers le systeme de contrôle" de ton lit ?
- Photos lisibles de/des cartes de ton lit ?

 
pseudo de remplacement artouste
http://forum.arduino.cc/index.php?action=profile;u=49110

alexandrev

Bonjour,

le système actuel est mort, le réparateur la jeté, j'ai une télécommande neuve filaire qui fonctionne.
Je vais l'ouvrir pour repérer les fils et ponter sur les 4 relais.

Vais essayer, je vous donnerais le résultat.

J'ai commencé à améliorer en ajoutant un petit écran et un bouton pour faire un menu config afin de ne pas avoir à brancher la carte au pc pour changer les codes de télécommande.

pour millis(); tu me rassure merci

Artouste

le système actuel est mort, le réparateur la jeté, j'ai une télécommande neuve filaire qui fonctionne.
Je vais l'ouvrir pour repérer les fils et ponter sur les 4 relais.
bonsoir
OK , donc tu veux greffer un systeme recepteur IR/commande  en // sur la telco filaire ?
A chaud je dirais que c'est une bonne idée.
cette telecommande filaire est connectée comment sur "le lit" ?
il y a un connecteur ?
ta telco filaire comporte combien de "boutons" ?
fais qq photos de tout çà


J-M-L

En ligne avec les autres questions

Pour millis() comme vos variables sont des unsigned long si vous faites dans votre test
if (... && !((actualButtonTime - lastButtonTime) <= TIMEOUT_DELAY)) {...}
ça suffit pour traiter le cas d'overflow au bout de 50 jours car les calculs se feront en nombre positifs
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

alexandrev

Merci à tous pour vos conseils le montage est terminé et installé sous mon lit.
Voilà deux photos du pontage sur la télécommande et boîtier on ne voit pas très bien.

Pensez-vous que je peux laisser le récepteur infrarouge branché comme ça ou est-ce qu'il vaut mieux souder les fils directement sur la carte car avec le temps j'ai peur que cela ne fasse plus contacts comme il faut.

Artouste

Merci à tous pour vos conseils le montage est terminé et installé sous mon lit.
Voilà deux photos du pontage sur la télécommande et boîtier on ne voit pas très bien.

Pensez-vous que je peux laisser le récepteur infrarouge branché comme ça ou est-ce qu'il vaut mieux souder les fils directement sur la carte car avec le temps j'ai peur que cela ne fasse plus contacts comme il faut.
Bonsoir
:smiley-mr-green:

çà pourrait surement être ... mieux "conditionné"  8)

Mais pragmatiquement aujourd'hui , l'important est "le service rendu" pour ton confort quotidien.


Rien ne t'empêche d'ores et déjà , de "plancher" sur une  "V2"

Go Up