Reset d'un Mega depuis web serveur

bonjour j ai besoin de faire des reset depuis mon serveur web j ai donc créer un lien qui active une sortie numérique a l état bas liaison de la broche numérique et l entrée reset . commande sur lien passage a l état bas reset mais pas de redémarrage sans suppression de le la liaison électrique il y a apparament un boucle sans fin de reset comment faire ?

#define BOOT 12
void setup()
{
pinMode(BOOT, OUTPUT);digitalWrite(BOOT, HIGH);
}

// ************** boucle principale *******************************

void loop()                     // Programme en boucle
{...}
void selection() {
  if (readString.indexOf("?Marche") > 0) mode = 1; // mode 1 = Maintien a 19
  else if (readString.indexOf("?Arret") > 0) mode = 0; // mode 0 = arret = maintien A 10°
  else if (readString.indexOf("?Auto") > 0) mode = 2; // mode 2 = auto
  else if (readString.indexOf("?Reset") > 0) digitalWrite(BOOT, LOW) ;
  readString = "";
}

Pascal17740: j ai besoin de faire des reset depuis mon serveur web comment faire ?

tu peux faire un reset soft avec le watchdog par ex : - tu initialises le watchdog a 8s - tu fais une fonction reset qui contient uniquement while(1) - tu appel cette fonction dans ton serveur web suite a une commande particulière (de préférence cachée) du client

bonjour,
il faut faire un distingo entre les types de cartes aussi, les officielles et les clones.

The reset line has an internal pull-up resistor, but if the environment is noisy it can be insufficient and reset can therefore occur sporadically. Refer to datasheet for value of pull-up resistor on specific devices. Connecting the RESET so that it is possible to enter both high-voltage programming and ordinary low level reset can be achieved by applying a pull-up resistor to the RESET line. This pull-up resistor makes sure that reset does not go low unintended. The pull-up resistor can in theory be of any size, but if the Atmel®AVR® should be programmed from e.g. STK500/AVRISP the pull-up should not be so strong that the programmer cannot activate RESET by draw the RESET line low. The recommended pull-up resistor is 4.7kΩ or larger when using STK500 for programming. For debugWIRE to function properly, the pull-up must not be smaller than 10kΩ.

question pour le fun :
pourquoi vouloir faire un reset de la carte?

infobarquee:
question pour le fun :
pourquoi vouloir faire un reset de la carte?

car j ai une fonction qu y n’est prise en compte que lorsque je reste la carte
je force l’extinction de leds rgb a 23 et re allumage a 6 h

 if (!(heure <6 && heure >23 )){
    read_CONSO();
    read_DEMAIN();
    read_AUJOURDHUI();
    
   }

pour le re allumage cela passe bien mais pas l’extinction.

Donc c'est que tu as un problème de code quelque part et le reste n'est pas la bonne solution. Il faut trouver pourquoi la fonction ne se lance pas

Jambe: Donc c'est que tu as un problème de code quelque part et le reste n'est pas la bonne solution. Il faut trouver pourquoi la fonction ne se lance pas

j ai triturer le code, cette fonction ne peux etre plus simple et marche dans le sens allumage a 6 heure mis pas d'extinction

tout comme je veux faire le changement d heure pour le passage hiver/ete et ete/hiver ce n 'est pas pris en compte je n ai toujours pas trouver le pourquoi

 // passage à l'heure d'été +1 heure
    // la lib RTC a une fonction: dayOfWeek qui donne le jour de la semaine (la DS1307 se charge de tout !)
    // réponse: 0 -> dimanche, 1 -> lundi etc...
    //
    if ((heure == 2) && (minute == 0) && (seconde == 0) && (jour_semaine == 0) && (mois == 3) && (jour > 24)) {
      heure = 3;
      RTCsetTime();
    }

    // passage à l'heure d'hiver -1 heure
    if ((heure == 3) && (minute == 0) && (seconde == 0) && (jour_semaine == 0) && (mois == 10) && (jour > 24) && (mem_chg_heure == 0)) {
      heure = 2;
      RTCsetTime();
      mem_chg_heure = 1;
    }

si tu prenais un problème à la fois et mettais ton code en entier, ca serait plus simple, non?

Pascal17740:

 if (!(heure <6 && heure >23 )){

read_CONSO();
    read_DEMAIN();
    read_AUJOURDHUI();
   
  }

La condition du if est toujours vraie quelle que soit la valeur de la variable heure, car celle-ci ne peut pas être à la fois inférieure à 6 et supérieure à 23…

Pascal17740: tout comme je veux faire le changement d heure pour le passage hiver/ete et ete/hiver ce n 'est pas pris en compte je n ai toujours pas trouver le pourquoi

 // passage à l'heure d'été +1 heure
    // la lib RTC a une fonction: dayOfWeek qui donne le jour de la semaine (la DS1307 se charge de tout !)
    // réponse: 0 -> dimanche, 1 -> lundi etc...
    //
    if ((heure == 2) && (minute == 0) && (seconde == 0) && (jour_semaine == 0) && (mois == 3) && (jour > 24)) {
      heure = 3;
      RTCsetTime();
    }

    // passage à l'heure d'hiver -1 heure     if ((heure == 3) && (minute == 0) && (seconde == 0) && (jour_semaine == 0) && (mois == 10) && (jour > 24) && (mem_chg_heure == 0)) {       heure = 2;       RTCsetTime();       mem_chg_heure = 1;     }

Pour que ce genre de code (fragile) fonctionne, il faut être sûr de l'exécuter au moins une fois par seconde.

Après le problème est peut-être ailleurs, mais sans le reste du code...

bricoleau:
La condition du if est toujours vraie quelle que soit la valeur de la variable heure, car celle-ci ne peut pas être à la fois inférieure à 6 et supérieure à 23…

ce type de formule fonctionne bien dans ma regulation de chauffage
if (heure >16) && (heure <23 ){

lol

Oui effectivement, il est possible de trouver un nombre plus grand que 16 [u]et[/u] plus petit que 23

Par contre, j'ai plus de mal à trouver un nombre plus petit que 6 [u]et[/u] plus grand que 23. C'est pourtant la condition que tu as indiquée dans ton if

infobarquee:
si tu prenais un problème à la fois et mettais ton code en entier, ca serait plus simple, non?

void loop()                     // Programme en boucle
{

  if (!(DS1307isrunning()) && (reg_horloge < 7)) {      // si l'horloge n'est pas configurée
    digitalWrite(LEC_CPT1, LOW);
    if (!mem_reg_horloge) {
      switch (reg_horloge) { // debut de la structure
        case 1: Serial.println (F("Entrer Heure: "));
          break;
        case 2: Serial.println (F("Entrer Minute: "));
          break;
        case 3: Serial.println (F("Entrer Seconde: "));
          break;
        case 4: Serial.println (F("Entrer Jour: "));
          break;
        case 5: Serial.println (F("Entrer Mois: "));
          break;
        case 6: Serial.println (F("Entrer Annee 20xx: "));
          break;
      }
      mem_reg_horloge = true;
    }
    if (Serial.available() > 0) { // si caractère dans la file d'attente

      //---- lecture du nombre reçu
      while (Serial.available() > 0) { // tant que buffer pas vide pour lire d'une traite tous les caractères reçus
        inByte = Serial.read(); // renvoie le 1er octet présent dans la file attente série (-1 si aucun)
        if (((inByte > 47) && (inByte < 58)) || (inByte == 13 )) {
          ReceptionOctet = inByte - 48; // transforme valeur ASCII en valeur décimale
          if ((ReceptionOctet >= 0) && (ReceptionOctet <= 9)) ReceptionNombre = (ReceptionNombre * 10) + ReceptionOctet;
          // si valeur reçue correspond à un chiffre on calcule nombre
        }
        else presence_teleinfo = -1;
      } // fin while
      if (inByte == 13) {
        if ((ReceptionNombre > val_max[reg_horloge - 1]) || (ReceptionNombre == -1)) {
          Serial.println(F("Erreur"));
          ReceptionNombre = 0;
          mem_reg_horloge = true;
        }
        else {
          switch (reg_horloge) { // debut de la structure
            case 1: heure = ReceptionNombre;
              break;
            case 2: minute = ReceptionNombre;
              break;
            case 3: seconde = ReceptionNombre;
              break;
            case 4: jour = ReceptionNombre;
              break;
            case 5: mois = ReceptionNombre;
              break;
            case 6: annee = 2000 + ReceptionNombre;
              break;
          }

          mem_reg_horloge = false;
          ReceptionNombre = 0;
          ++reg_horloge;

          if (reg_horloge > 6) {
            RTCsetTime();
            Serial.println(F("Reglage heure OK - installer le cavalier pour la teleinfo"));
            digitalWrite(LEC_CPT1, HIGH);
          }
        }
      }
    }
  }

  else {

    RTCgetTime();

    // passage à l'heure d'été +1 heure
    // la lib RTC a une fonction: dayOfWeek qui donne le jour de la semaine (la DS1307 se charge de tout !)
    // réponse: 0 -> dimanche, 1 -> lundi etc...
    //
    if ((heure == 2) && (minute == 0) && (seconde == 0) && (jour_semaine == 0) && (mois == 3) && (jour > 24)) {
      heure = 3;
      RTCsetTime();
    }

    // passage à l'heure d'hiver -1 heure
    if ((heure == 3) && (minute == 0) && (seconde == 0) && (jour_semaine == 0) && (mois == 10) && (jour > 24) && (mem_chg_heure == 0)) {
      heure = 2;
      RTCsetTime();
      mem_chg_heure = 1;
    }
///////////////////////////////////////////////////////////////////
// mise à l'heure de la RTC (DS1307)
///////////////////////////////////////////////////////////////////
void RTCsetTime() {
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0x00); // start at register 0
  Wire.write(decToBcd(seconde) & 0x7f);    // 0 to bit 7 starts the clock
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(heure));
  Wire.write(decToBcd(jour_semaine));
  Wire.write(decToBcd(jour));
  Wire.write(decToBcd(mois));
  Wire.write(decToBcd(annee % 1000));
  Wire.endTransmission();
}

///////////////////////////////////////////////////////////////////
// Lecture de l'heure sur la RTC (DS1307)
///////////////////////////////////////////////////////////////////
void RTCgetTime() {
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0x00);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
  seconde = bcdToDec(Wire.read() & 0x7f);
  minute = bcdToDec(Wire.read());
  heure = bcdToDec(Wire.read() & 0x3f);  // Need to change this if 12 hour am/pm
  jour_semaine  = bcdToDec(Wire.read());
  jour = bcdToDec(Wire.read());
  mois = bcdToDec(Wire.read());
  annee = 2000 + bcdToDec(Wire.read());
}

///////////////////////////////////////////////////////////////////
// Verification fonctionnement RTC (DS1307)
///////////////////////////////////////////////////////////////////
uint8_t DS1307isrunning(void) {
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write((byte)0x00);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_I2C_ADDRESS, 1);
  uint8_t ss = Wire.read();
  return !(ss >> 7);
}

bricoleau:
lol

Oui effectivement, il est possible de trouver un nombre plus grand que 16 et plus petit que 23

Par contre, j’ai plus de mal à trouver un nombre plus petit que 6 et plus grand que 23. C’est pourtant la condition que tu as indiquée dans ton if

donc vaudrais mieux ecrire

if (heure >6 && heure <23 )){
    read_CONSO();
    read_DEMAIN();
    read_AUJOURDHUI();
    
   }

vu sous cet angle je pense que cela conviendrais mieux