Allumer led X temps après appui bouton + problème commande RF433Mhz

Bonsoir à toutes et tous,

Je viens d'acquérir un Arduino Mega 2560 officiel.

Je suis en complet apprentissage au niveau électronique et programmation ( quelque petite notion en programmation C++). J'ai réalisé grâce aux exemples du logiciel arduino et l'aide de skywodd (sur sin site) une refonte d'un programme mettant en place un capteur DS18B20 un écran LCD et un bouton + la commande d'une prise RF433Mhz. Personnellement, j'en ai c***z comme un bœuf mais j'y suis arriver par force, courage et patience surtout :@ arghhh enfin pas totalement, car le bouzin ne marche pas bien droit dans ses bottes.

Dans un premier temps voici mon code crée:

#include <OneWire.h>
#include <LiquidCrystal.h>
#include <RCSwitch.h>
 
#define DS18B20 0x28
#define BROCHE_ONEWIRE 7 

RCSwitch mySwitch = RCSwitch();
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 
OneWire ds(BROCHE_ONEWIRE);
const int ledfroid = 8;
const int ledchaud = 9;
const int ledecran = 52;
const int bouttonecran = 53;
int etatboutton = 0;

boolean getTemperature(float *temp)
{
  byte data[9], addr[8];
 
  if (!ds.search(addr)) 
  {
    ds.reset_search();
    return false;
  }
   
  if (OneWire::crc8(addr, 7) != addr[7])
    return false;    
    
  if (addr[0] != DS18B20)  
    return false;
 
  ds.reset();             
  ds.select(addr);        
   
  ds.write(0x44, 1);      
  delay(800);
   
  ds.reset();
  ds.select(addr);
  ds.write(0xBE);
 
  for (byte i = 0; i < 9; i++)
    data[i] = ds.read();
   
  *temp = ((data[1] << 8) | data[0]) * 0.0625; 
   
  return true;
}

void setup() 
{
  lcd.begin(16, 2);
  lcd.print("Temp:");
  pinMode (ledfroid, OUTPUT);
  pinMode (ledchaud, OUTPUT);
  pinMode (ledecran, OUTPUT);  
  mySwitch.enableTransmit(21);  
  mySwitch.setPulseLength(320); 
  mySwitch.setProtocol(1);
}

void loop() 
{
  float temp;
   
  if(getTemperature(&temp)) 
 {
     
    lcd.setCursor(6, 0);
    lcd.print(temp);
    lcd.setCursor(0, 1);
    lcd.print("Je t'aime pupuce");
    
  if(temp >= 30) 
  {//activation ledchaud & prise B (ventilateur)
      digitalWrite(ledchaud, HIGH);
      digitalWrite(ledfroid, LOW);
      mySwitch.switchOn("11001", "0100");
      delay (100);   
      mySwitch.send(332113, 24);  
      delay (100);   
      mySwitch.send("000001010001000101010001");
      delay (100);   
      mySwitch.sendTriState("00FF0F0FFF0F");
      delay (100);
  } 
  else
  {//activation ledfroid & desactivation prise B
      digitalWrite(ledchaud, LOW);
      digitalWrite(ledfroid, HIGH);
      mySwitch.switchOff("11001", "0100");
      delay (100);
      mySwitch.send(332116, 24);   
      delay (100);
      mySwitch.send("000001010001000101010001");  
      delay (100);  
      mySwitch.sendTriState("00FF0F0FFF0F"); 
  }
 }
  
 {//allumer ecran lcd pendant 10 secondes 
  etatboutton = digitalRead (bouttonecran);
  if (etatboutton == HIGH)
  {
    digitalWrite (ledecran, HIGH);
    delay (10000);
  }
  else
  {
    digitalWrite (ledecran, LOW);
  }
 }  
  
}

Alors voici mes problèmes:

1= je veut que la commande de ma prise soit en marche si plus de 30°C et éteinte si moins de 30°C ==> mais je dois avoir fait une erreur car ma prise reste allumer même si consigne de température est plus de 30 ou moins de 30. (enfin ma commande RF433Mhz ne marche point) en revanche mes LED fonctionne bien en fonction de la temp.

2= je veut que la LED de l’écran LCD s'allume pendant 10 secondes après appui sur un bouton ==> mais mon delay bloc tout pendant 10 secondes ( surtout acquisition de température)

3= l'ensemble est beaucoup beaucoup trop long ... actualisation de la température > à 5sec (au lieu de <1sec) etc...

enfin ça ne fonctionne pas comme je le voudrait alors, Serait-il possible de m'orienter sur une solution pour remédier à tout ceci s'il vous plait afin que je comprenne car la je sèche trop.

je vous remercie d’ores et déjà pour vôtre aide que vous m'apporterez

cordialement,
VISIVIC

bonjour,
déjà du gauffrage dans le code
pourquoi le mettre entre {} vu qu'il n'y a aucune condition?

 {//allumer ecran lcd pendant 10 secondes 
....
}

avant de mettre ton 433, essaye avec une led toute bête.
mais ca risque de faire on/off en permanence : ) j'ai plus le terme entête , hys..........quelque chose.

sur le ds12b20, plus tu diminue le temps d'acquisition, moins il est précis et vice versa

Infobarquee qui essaye de lui tirer les vers du nez :grin:

Hystapopulos?
Hysabracadabra?
Hysidor????

:grin:

Hisse Thérèse ?

hisse hé ho, ca va oui :slight_smile:

Hystérique ? Hissélagranvoale ?

infobarquee:
hisse hé ho, ca va oui :slight_smile:

Meme pour des refrains de chants de marins , il ne faut jamais bisser surtout à bord contre le vent :grin: :grin:

Visvic: on rigole bien sur quand tu reviendra ne panique pas on t'aidera tout de même ! on es juste des hyspisdicounasse ! xD

hips habutropderuhm

Bonjour a vous tous et merci pour vos réponse ... hys ... hysté.. quoi déjà ???? lol

désole pour le retard, gros travail et apres gros dodo alors pas eu le temps.

alors,

infobarquee:
bonjour,
déjà du gauffrage dans le code
pourquoi le mettre entre {} vu qu'il n'y a aucune condition?

 {//allumer ecran lcd pendant 10 secondes 

....
}




avant de mettre ton 433, essaye avec une led toute bête.
mais ca risque de faire on/off en permanence : ) j'ai plus le terme entête , hys..........quelque chose.

sur le ds12b20, plus tu diminue le temps d'acquisition, moins il est précis et vice versa

Alors la raison est comme je débute comme un débutant (évidemment) dans la programmation je me met des petit " Paragraphe" pour détailler un peu mon ensemble et comme apparemment cela ne gène en rien le déroulement du "loop" je les ai laisser.
Ensuite, pour la LED, j'ai déjà en place une LED chaud et LED froid qui me serve a savoir si on dépasse ou non la consigne (30 degrés) est ce que c’était sa que tu voulais me dire ???

et pour le ds18b20 il est réglé sur le plus précis mais avant le rajout du reste( ctad= juste acquisition température et affichage sur LCD) il était actualise a environ un peu moins d'une seconde.

aller ho hysté à tous =)) mdr

cordialement
visvic

Il y a quelqu'un ... quelqu'un... quelqu'... quel... :~

Ouiii !

Bon alors allons y pour les corrections :

#include <OneWire.h>
#include <LiquidCrystal.h>
#include <RCSwitch.h>
 
#define DS18B20 0x28
#define BROCHE_ONEWIRE 7 

RCSwitch mySwitch = RCSwitch();
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 
OneWire ds(BROCHE_ONEWIRE);
const int ledfroid = 8;
const int ledchaud = 9;
const int ledecran = 52;
const int bouttonecran = 53;
int etatboutton = 0;
int flag_led_allume = 0;
unsigned long temps1;
unsigned long temps2;
boolean getTemperature(float *temp)
{
  byte data[9], addr[8];
 
  if (!ds.search(addr)) 
  {
    ds.reset_search();
    return false;
  }
   
  if (OneWire::crc8(addr, 7) != addr[7])
    return false;    
    
  if (addr[0] != DS18B20)  
    return false;
 
  ds.reset();             
  ds.select(addr);        
   
  ds.write(0x44, 1);      
  delay(800);
   
  ds.reset();
  ds.select(addr);
  ds.write(0xBE);
 
  for (byte i = 0; i < 9; i++)
    data[i] = ds.read();
   
  *temp = ((data[1] << 8) | data[0]) * 0.0625; 
   
  return true;
}

void setup() 
{
  lcd.begin(16, 2);
  lcd.print("Temp:");
  pinMode (ledfroid, OUTPUT);
  pinMode (ledchaud, OUTPUT);
  pinMode (ledecran, OUTPUT);  
  mySwitch.enableTransmit(21);  
  mySwitch.setPulseLength(320); 
  mySwitch.setProtocol(1);
}

void loop() 
{
  float temp;
   
  if(getTemperature(&temp)) 
 {
     
    lcd.setCursor(6, 0);
    lcd.print(temp);
    lcd.setCursor(0, 1);
    lcd.print("Je t'aime pupuce");  // mode loveur active !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! :D
    
  if(temp >= 30) 
  {//activation ledchaud & prise B (ventilateur)
      digitalWrite(ledchaud, HIGH);
      digitalWrite(ledfroid, LOW);
      mySwitch.switchOn("11001", "0100");
      delay (100);   
      mySwitch.send(332113, 24);  
      delay (100);   
      mySwitch.send("000001010001000101010001");
      delay (100);   
      mySwitch.sendTriState("00FF0F0FFF0F");
      delay (100);
  } 
  else
  {//activation ledfroid & desactivation prise B
      digitalWrite(ledchaud, LOW);
      digitalWrite(ledfroid, HIGH);
      mySwitch.switchOff("11001", "0100");
      delay (100);
      mySwitch.send(332116, 24);   
      delay (100);
      mySwitch.send("000001010001000101010001");  
      delay (100);  
      mySwitch.sendTriState("00FF0F0FFF0F"); 
  }
 }
  
 {//allumer ecran lcd pendant 10 secondes 
  etatboutton = digitalRead (bouttonecran);

  if (etatboutton == HIGH && flag_led_allume ==0)// si bouton appuyer et pas encore de led allumer
  {
    digitalWrite (ledecran, HIGH);   // allumage led
    flag_led_allume=1;                      // flag led allumer
    temps1=millis();                             // millis nous retourne le moment ou la led a ete allume
  }
   if (etatboutton != HIGH && flag_led_allume ==0)// si plus de flag led allume et plus de bouton appuyer
  {
    digitalWrite (ledecran, LOW);   // on eteind la led car plus de bouton appuyer et plus de flag led allume
  }

  temps2=millis();// on prend la valeur courante 
  if(flag_led_allume ==1 && temps2 > (temps1+10000) // on vérifie si la led est allume et si elle l'est depuis plus de 10 secondes
  {
        flag_led_allume =0;  // on enlève le flag de led allumer pour qu'elle soit éteinte au prochain tour 
   }
 }  
  
}

Voila pour les 10 secondes pour le reste pense à enlever les delays je suis pas sur qu'il soit utile ou du moins passe à 50 sa suffira amplement.
Sa réduira le temps de traitement générale.

Skizo.

@skizoH

bonjour, et ex-skizoh (lol) moi pour les remerciement tardif ... TRAVAIL ... --"

Bon je n'ai pas encore essayé mais évidemment que cela doit être une très bonne solution et correction de mon gribouillon de code ^^

Je te remercie pour la correction apportée et le temps pour y avoir passer.

Je te tiens au courant si tout cela fonctionne =)

cordialement,
Visvic

Pas de problème :slight_smile:

A l'aide!!!!!
J'essaye d'écrire un programme qui en fonction de l'état d'une broche allume le LED 1ou le LED2pendant un temps donné!!
Ca s'allume mais ne s'éteint plus

Voici le programme: neprenez surtoutpasles commentaires en compte c'est du n'importe quoi

const int LED1=3; //declaration constante de broche
const int LED2=7;
const int inPin =5;
// --- Déclaration des variables globales ---
boolean etat_broche;
long temps;
// --- Initialisation des fonctionnalités utilisées ---
// ...

//**************** FONCTION SETUP = Code d'initialisation *****
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme

void setup() { // debut de la fonction setup()

// --- ici instructions à exécuter au démarrage ---

pinMode(LED1, OUTPUT); //met la broche en sortie
pinMode(LED2, OUTPUT);
pinMode(inPin, INPUT);

temps = millis();
} // fin de la fonction setup()
// ********************************************************************************

//*************** FONCTION LOOP = Boucle sans fin = coeur du programme *************
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()

etat_broche = digitalRead(inPin);

if (etat_broche ==0)
{
vibrateright();
}

else
{
vibrateleft();
}

} // fin de la fonction setup()
// ********************************************************************************

void vibrateleft()
{
//allumer led gauche
// --- ici instructions à exécuter par le programme principal ---

digitalWrite(LED1,LOW); // met la broche au niveau haut (5V) – allume la LED

if((millis() - temps) < 5000)
{
etat_broche = !etat_broche; //on inverse l'état de la LED
digitalWrite(LED2, HIGH); //on allume ou éteint
temps = millis(); //on stocke la nouvelle heure
}
//digitalWrite(LED1,LOW); // met la broche au niveau haut (5V) – allume la LED
//digitalWrite(LED2,HIGH);
}

void vibrateright()
{

digitalWrite(LED2,LOW); // met la broche au niveau haut (5V) – allume la LED

if((millis() - temps) < 5000)
{
etat_broche = !etat_broche; //on inverse l'état de la LED
digitalWrite(LED1, HIGH); //on allume ou éteint
temps = millis(); //on stocke la nouvelle heure
}
//digitalWrite(LED2,LOW); // met la broche au niveau haut (5V) – allume la LED
//digitalWrite(LED1,HIGH);
//digitalWrite(LED1,LOW); // met la broche au niveau bas (0V) – éteint la LED
//allumer led droite
}

// --- Fin programme ---