relais rf433

bonjour a tous
je suis un débutant en arduino pour mon premier projet
je m’attaque du plutôt ardue (pour moi)
mon projet est le suivant
piloter un poêle a pétrole électronique 5 bouton +, -, on/off, min, eco, auto.
je voudrait commander via mon rfxcom l’allumage et le passage en eco-auto-min (en bonus recupérer la valeur de la sonde de temperature du poele)
pour cela je me suis basé sur
un arduino uno R3
un shield 4 relais
une paire d’emeteur/recepteur 433 chinois type fs1000a et xy-mk-5v.
de par ma faible experience en codage j’ai fiat la chose suivant :
schema :

le code :

#include <RCSwitch.h>
#define relay1 12449942
#define relay2 13464924
#define relay3 14464928
#define relay4 15464929

RCSwitch mySwitch = RCSwitch();

// On limite ? un ?v?nement par seconde long
#define debounceDelay 1000

// On a 4 relais, donc on a 4 timers.
last_times[4] = {0,0,0,0};

//on declare les sortie relais
int r1 = 8;
int r2 = 9;
int r3 = 10;
int r4 = 11;
//on declare les entr?es led
int rl1 = a0;
int rl2 = a1;
int rl3 = a2;
int rl4 = a3;

void setup() {
    Serial.begin(9600);
// declaration de reception sur le interupt0 (uno port2)
    mySwitch.enableReceive(0);
//declaration de transmition sur le port 13
		mySwitch.enableTransmit(13);

//declaration des sortie relais
pinMode(r1, OUTPUT);
pinMode(r2, OUTPUT);
pinMode(r3, OUTPUT);
pinMode(r4, OUTPUT);

//declaration des entr?e analogiques
pinMode(rl1, INPUT);
pinMode(rl2, INPUT);
pinMode(rl3, INPUT);
pinMode(rl4, INPUT);
}

//declaration valeur input
int rl1value = 0;
int rl2value = 0;
int rl3value = 0;
int rl4value = 0;
//declaration derniere valeur input
int rl1lastvalue = 0;
int rl2lastvalue = 0;
int rl3lastvalue = 0;
int rl4lastvalue = 0;

bool debounce(int number) {
    if ((last_times[number] == 0) ||
        ((millis() - last_times[number]) > debounceDelay)) {
        last_times[number] = millis();
        return true;
    }
    return false;
}

void loop() {

//mesure des valeur analogique
rl1value = analogRead(rl1);
rl2value = analogRead(rl2);
rl3value = analogRead(rl3);
rl4value = analogRead(rl4);


//envoie de l'etat des commandes
if (rl1value == rl1lastvalue) { //comparaison a la valeur precedente si pareil goto suivant
	goto rl1goto;
	}
	if (rl1value > 500) { // si il y a une tension non residuelle sur la vaeur alors
		mySwitch.send(5391, 24); // on envoi une valeur 
		Serial.println("ON");		
		Serial.println(rl1value);
 		delay(500); 
	}
		else {
			mySwitch.send(5381, 24); // sinon on envoi une valeur autre
			Serial.println("OFF");
			Serial.println(rl1value);
  		delay(500); 
		}
rl1goto:
if (rl2value == rl2lastvalue) {
	goto rl2goto;
	}
	if (rl2value > 500) {
		mySwitch.send(5392, 24);
  	delay(500); 
	}
		else {
			mySwitch.send(5382, 24);
 	 		delay(500); 
		}
rl2goto:
if (rl3value == rl3lastvalue) {
	goto rl3goto;
	}
	if (rl3value > 500) {
		mySwitch.send(5393, 24);
  	delay(500); 
	}
		else {
			mySwitch.send(5383, 24);
  		delay(500); 
		}
rl3goto:
if (rl4value == rl4lastvalue) {
	goto rl4goto;
	}
	if (rl4value > 500) {
		mySwitch.send(5394, 24);
  	delay(500); 
	}
		else {
			mySwitch.send(5384, 24);
  		delay(500); 
		}
rl4goto:

//memorisation de la valeur precedente
rl1lastvalue = rl1value;
rl2lastvalue = rl2value;
rl3lastvalue = rl3value;
rl4lastvalue = rl4value;

//declenchament par interrupt0
  if (mySwitch.available()) {

    int value = mySwitch.getReceivedValue();

    // on remet ? zero le timer
    while (!Serial) ;

    switch (value) {
        case relay1:
            if (debounce(0))
                Serial.println("relais 1");
								digitalWrite(r1, HIGH);
								delay (500)
								digitalWrite(r1, LOW);
            break;
        case relay2:
            if (debounce(1))
                Serial.println("relais 2");
								digitalWrite(r2, HIGH);
								delay (500)
								digitalWrite(r2, LOW);
            break;
        case relay2:
            if (debounce(2))
                Serial.println("relais 3");
								digitalWrite(r3, HIGH);
								delay (500)
								digitalWrite(r3, LOW);
            break;
        case relay2:
            if (debounce(3))
                Serial.println("relais 4");
								digitalWrite(r4, HIGH);
								delay (500)
								digitalWrite(r4, LOW);
            break;
        default:
            Serial.print("commande ignoree: ");
            Serial.println(value);
            break;
    }

    mySwitch.resetAvailable();
  }
}

j’aurais besoin de votre aide pour mettre en lumière les bug et autre ineptie que le debutant que je suis a integré dans ce code.
en gros avant que je ne le mette en pratique ce projet est t’il bon ?
merci par avance
damien

personne pour y jeter un oeil voir j'ai pas trop ecrit de betise ?

Tu en demandes trop.
On ne va pas vérifier du code que tu n’as pas testé.
On a autre chose à faire.
Donc tu testes et tu reviens avec des messages d’erreur ou des explications sur ce qui ne va pas.
Et avant de revenir tu cherches un peu et tu montres que tu as cherché.

Enlus ton code est assez affreux à lire (indentations qui partent dans tous les sens … Essaie formatage automatique dans le menu de l’IDE pour mettre un peu d’ordre)

Et les goto …

B83s:
Enlus ton code est assez affreux à lire (indentations qui partent dans tous les sens … Essaie formatage automatique dans le menu de l’IDE pour mettre un peu d’ordre)

Et les goto …

merci d’accord je reformate tout ca ^^
je l’ai fait avec fritzing qui n’as pas de formatage automatique
desoler pour les goto ca fait vraiment programmeur du dimanche (ce que je suis)

ca doit etre mieux comme ca (reformater et sans les goto)

#include <RCSwitch.h>
#define relay1 12449942
#define relay2 13464924
#define relay3 14464928
#define relay4 15464929

RCSwitch mySwitch = RCSwitch();

// On limite ? un ?v?nement par seconde long
#define debounceDelay 1000

// On a 4 relais, donc on a 4 timers.
last_times[4] = {0, 0, 0, 0};

//on declare les sortie relais
int r1 = 8;
int r2 = 9;
int r3 = 10;
int r4 = 11;
//on declare les entr?es led
int rl1 = a0;
int rl2 = a1;
int rl3 = a2;
int rl4 = a3;

void setup() {
  Serial.begin(9600);
  // declaration de reception sur le interupt0 (uno port2)
  mySwitch.enableReceive(0);
  //declaration de transmition sur le port 13
  mySwitch.enableTransmit(13);

  //declaration des sortie relais
  pinMode(r1, OUTPUT);
  pinMode(r2, OUTPUT);
  pinMode(r3, OUTPUT);
  pinMode(r4, OUTPUT);

  //declaration des entr?e analogiques
  pinMode(rl1, INPUT);
  pinMode(rl2, INPUT);
  pinMode(rl3, INPUT);
  pinMode(rl4, INPUT);
}

//declaration valeur input
int rl1value = 0;
int rl2value = 0;
int rl3value = 0;
int rl4value = 0;
//declaration derniere valeur input
int rl1lastvalue = 0;
int rl2lastvalue = 0;
int rl3lastvalue = 0;
int rl4lastvalue = 0;

bool debounce(int number) {
  if ((last_times[number] == 0) ||
      ((millis() - last_times[number]) > debounceDelay)) {
    last_times[number] = millis();
    return true;
  }
  return false;
}

void loop() {

  //mesure des valeur analogique
  rl1value = analogRead(rl1);
  rl2value = analogRead(rl2);
  rl3value = analogRead(rl3);
  rl4value = analogRead(rl4);


  //envoie de l'etat des commandes
  if (rl1value /= rl1lastvalue) { //comparaison a la valeur precedente si differente alors
    if (rl1value > 500) { // si il y a une tension non residuelle sur la vaeur alors
      mySwitch.send(5391, 24); // on envoi une valeur
      Serial.println("ON");
      Serial.println(rl1value);
      delay(500);
    }
    else {
      mySwitch.send(5381, 24); // sinon on envoi une valeur autre
      Serial.println("OFF");
      Serial.println(rl1value);
      delay(500);
    }
  }
  if (rl2value /= rl2lastvalue) {
    if (rl2value > 500) {
      mySwitch.send(5392, 24);
      delay(500);
    }
    else {
      mySwitch.send(5382, 24);
      delay(500);
    }
  }
  if (rl3value /= rl3lastvalue) {
    if (rl3value > 500) {
      mySwitch.send(5393, 24);
      delay(500);
    }
    else {
      mySwitch.send(5383, 24);
      delay(500);
    }
  }
  if (rl4value /= rl4lastvalue) {
    if (rl4value > 500) {
      mySwitch.send(5394, 24);
      delay(500);
    }
    else {
      mySwitch.send(5384, 24);
      delay(500);
    }
  }
  //memorisation de la valeur precedente
  rl1lastvalue = rl1value;
  rl2lastvalue = rl2value;
  rl3lastvalue = rl3value;
  rl4lastvalue = rl4value;

  //declenchament par interrupt0
  if (mySwitch.available()) {

    int value = mySwitch.getReceivedValue();

    // on remet ? zero le timer
    while (!Serial) ;

    switch (value) {
      case relay1:
        if (debounce(0))
          Serial.println("relais 1");
        digitalWrite(r1, HIGH);
        delay (500)
        digitalWrite(r1, LOW);
        break;
      case relay2:
        if (debounce(1))
          Serial.println("relais 2");
        digitalWrite(r2, HIGH);
        delay (500)
        digitalWrite(r2, LOW);
        break;
      case relay2:
        if (debounce(2))
          Serial.println("relais 3");
        digitalWrite(r3, HIGH);
        delay (500)
        digitalWrite(r3, LOW);
        break;
      case relay2:
        if (debounce(3))
          Serial.println("relais 4");
        digitalWrite(r4, HIGH);
        delay (500)
        digitalWrite(r4, LOW);
        break;
      default:
        Serial.print("commande ingnoree: ");
        Serial.println(value);
        break;
    }

    mySwitch.resetAvailable();
  }
}

pourquoi le goto a si mauvaise reputation ca ralenti le code ?
merci en tout cas pour tout et desolé si je demande avant de tester
c’est que je voudrait pas faire cramer la carte par meconnaissance car je suppose que sur l’arduino il ne doit pas y avoir protection contre les court-circuit

Bonjour,

sheep300: merci en tout cas pour tout et desolé si je demande avant de tester c'est que je voudrait pas faire cramer la carte par meconnaissance car je suppose que sur l'arduino il ne doit pas y avoir protection contre les court-circuit

Tu voudrais qu'une personne essuie les plâtres à ta place. :o Je te rassure même si une personne teste ton programme cela ne te protègera pas des court-circuits qui sont inhérents à ton propre montage. ;) @+

le test "différent de" s'écrit != ... et pas /= (résultat de la division par le membre de droite)

et comme le dit Icare ... les courts circuits ne sont pas dans le code !!!

tu eux faire tourner ton code sur la carte sans y brancher le poêle .. histoire de voir comment réagissent tes relais ..

d'accord ! merci pour le != et le reste

rebonjour a tous mon projet avance a grand pas

  • j’ai une question bête et méchante il y a t’il un moyen de dire a notre arduino la tension a partir duquel une entrée numérique est considérer comme a 1
    car je me sert finalement des entrées numerique pour lire si la LED est allumé car les analogiques son trop fluctuantes.
  • deplus j’ai l’impression (ou plutot un constat) que sur un nano “chinois” quand je met un 3,3V sur une entrée numerique les entrée a codé l’on aussi (quand je met le 3,3V sur le pin 6, le pin 5 passe lui aussi a 1 Oo)
    c’est due au fait que ca soit un clone, a la platine d’essaie ou c’est un probleme connu ? et surtout y’a t’il une solution ?
    merci par avance