Riavvio quando si attiva il relè

Ciao a tutti,

uso delle schede con wemos d1 mini in casa per leggere temperatura e umidità, accendere le luci, sono collegate tra loro tramite rete mesh con la libreria painlessmesh, ma ho un problema, ogni tanto accendo la luce sia tramite pulsante che da remoto, la scheda si riavvia, non riesco a capire cosa può avere, inserisco il codice, se a qualcuno viene qualche idea, inserisco anche lo schema della scheda, grazie a tutti

//************************************************************
// read temperature and humidity "camera" lolin D1 R2
//
// rele D7 -- 13
// AHT 
// pulsante D5 -- 14
//
//************************************************************
#include "Button2.h"
#include <AHTxx.h>
float h,t;

AHTxx aht20(AHTXX_ADDRESS_X38, AHT2x_SENSOR);
#define BUTTON_1        D5

const byte relay_pin = D7;
bool relayState = LOW;
unsigned long now;


Button2 btn1(BUTTON_1);
//#include "painlessMesh.h"
#include "namedMesh.h"

#define   MESH_PREFIX     "whateverYouLike"
#define   MESH_PASSWORD   "somethingSneaky"
#define   MESH_PORT       5555

Scheduler userScheduler; // to control your personal task
//painlessMesh  mesh;
namedMesh  mesh;
String msg,rel;
String nodeName = "camera"; // Name needs to be unique
String to = "bridgemqtt";
uint32_t root_id;

#define ROLE    "camera"
#define VERSION "Camera v3.0.5"
#define MESSAGE "camera "

// User stub
void sendMessage() ; // Prototype so PlatformIO doesn't complain
void sendMessage1();

Task taskSendMessage( TASK_SECOND * 1 , TASK_FOREVER, &sendMessage );
Task taskSendMessage1( TASK_SECOND * 1 , TASK_FOREVER, &sendMessage1 );


void sendMessage() {
  read_AHT();
  msg = "temperatura/";
  msg += t;
  mesh.sendSingle(to, msg);
  msg = "umidita/";
  msg += h;
  mesh.sendSingle(to, msg);
  
  taskSendMessage.setInterval( random( TASK_SECOND * 300, TASK_SECOND * 400 ));
}

void sendMessage1() {
  update_status();
  taskSendMessage1.setInterval( random( TASK_SECOND * 450, TASK_SECOND * 550 ));
}

// Needed for painless library
void receivedCallback( uint32_t from, String &msg ) {
  Serial.printf("startHere: Received from %u msg=%s\n", from, msg.c_str());
  rel=msg;
  root_id=from;

    if (strcmp(rel.c_str(),"1") == 0){
      digitalWrite(relay_pin, HIGH);
      relayState = HIGH;
      msg = "output/";
      msg += "1";
      mesh.sendSingle(to, msg);
   }
   else if (strcmp(rel.c_str(),"0") == 0) {
    digitalWrite(relay_pin, LOW);
    relayState = LOW;
    msg = "output/";
    msg += "0";
    mesh.sendSingle(to, msg);
  }}

void newConnectionCallback(uint32_t nodeId) {
    Serial.printf("--> startHere: New Connection, nodeId = %u\n", nodeId);
}

void changedConnectionCallback() {
  Serial.printf("Changed connections\n");
}

void nodeTimeAdjustedCallback(int32_t offset) {
    Serial.printf("Adjusted time %u. Offset = %d\n", mesh.getNodeTime(),offset);
}

void read_AHT() {

  h = aht20.readHumidity();
  t = aht20.readTemperature();
  if (isnan(h) || isnan(t)) {
          msg = "error/";
          msg += "FailedtoreadfromAHTsensor";
          mesh.sendSingle(to, msg);
          return;
        }}

void button_setup()
{
  btn1.setPressedHandler([](Button2 & b) 
    {
      relayState = !relayState;
      digitalWrite(relay_pin,relayState);
      if (relayState == HIGH){
        msg = "output/";
        msg += "1";
        mesh.sendSingle(to, msg);
        
     }
      else if (relayState == LOW){
        msg = "output/";
        msg += "0";
        mesh.sendSingle(to, msg);
        
     }
    });
}

void update_status()
{
  long uptime = millis() / 60000L;
  msg = "uptime/";
  msg += uptime;
  mesh.sendSingle(to, msg);
  msg = "nodeid/";
  msg += mesh.getNodeId();
  mesh.sendSingle(to, msg);
  msg = "freememory/";
  msg += String(ESP.getFreeHeap());
  mesh.sendSingle(to, msg);
  msg = "version/";
  msg += VERSION;
  mesh.sendSingle(to, msg);
  msg = "root/";
  msg += root_id;
  mesh.sendSingle(to, msg);
  msg = "ip/";
  msg += WiFi.localIP().toString();
  mesh.sendSingle(to, msg);
  msg = "wifisignal/";
  msg += String(WiFi.RSSI());
  mesh.sendSingle(to, msg);
  
}

void setup() {
  Serial.begin(115200);
  aht20.begin();
  pinMode(relay_pin, OUTPUT);

//mesh.setDebugMsgTypes( ERROR | MESH_STATUS | CONNECTION | SYNC | COMMUNICATION | GENERAL | MSG_TYPES | REMOTE ); // all types on
  mesh.setDebugMsgTypes( ERROR | STARTUP | DEBUG );  // set before init() so that you can see startup messages

  mesh.init( MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT, WIFI_AP_STA, 11 );
  mesh.initOTAReceive(ROLE);
  mesh.setContainsRoot(true);
  mesh.setName(nodeName);
  mesh.onReceive(&receivedCallback);
  mesh.onNewConnection(&newConnectionCallback);
  mesh.onChangedConnections(&changedConnectionCallback);
  mesh.onNodeTimeAdjusted(&nodeTimeAdjustedCallback);

  userScheduler.addTask( taskSendMessage );
  userScheduler.addTask( taskSendMessage1 );
  taskSendMessage.enable();
  taskSendMessage1.enable();

  button_setup();
}

void loop() {
  // it will run the user scheduler as well
  mesh.update();
  btn1.loop();
   if((millis() - now) > 600000) { //600000 - 10 min
    now=millis();
      if(!(mesh.isConnected(root_id))){
        //Serial.printf("Reboot\n");
        ESP.restart();
    }}
}

Schema_V2.pdf (69.2 KB)

alimentazione insufficiente?

Uso un alimentatore 220 volt a 5 volt 1 ampere, ne ho cambiati due, ma continua, alle volte accendo spengo la luce per 10-15 volte di continuo,senza problemi, poi a caso si riavvia

Disturbi?

Metti lo schema

non saprei di che genere il problema è solo su due schedine che usano un solo pulsante, le altre usano due pulsanti e due relè, non hanno questo problema, lo schema è allegato al primo post

se ne parla spesso, i soliti maledetti rele
io personalmene li ho bannati

c e' un pdf allegato
potrebbe aggiungere anche qualche foto di come sono fatti i collegamenti:
fili non serrati
saldature non ottimali
...

Emm ... che luci accendi? A che tensione di lavoro? ... ti rammento il REGOLAMENTO, punto 15 e suoi sottopunti ... :roll_eyes:

Guglielmo

accendo delle luci a 12 volt alimentate dal solare, allego due fotografie della scheda,
i ponticelli che vedete perchè avevo sbagliato la pcb e i pin D3 e D4 stanno sempre alti


1 Like

Ok, grazie ...

... purtroppo, come ti è stato detto e come puoi facilmente verificare nelle varie discussioni qui sul forum, il relè, con Arduino, spesso danno problemi ... io vi ricordo sempre quanto scritto al punto 15.5 del REGOLAMENTO ... Arduino NON ha alcuna protezione conto le emissioni elettromagnetiche e ... se il disturbo è elevato, si blocca o fa reset :roll_eyes:

Poi provare con qualche diodo in antiparallelo sulle bobine dei relè fino ad arrivare alla completa separazione delle alimentazioni (come illustrato in varie discussioni) ...

Guglielmo

Escludendo problemi software, contatti imperfetti, e componenti guasti... dallo schema pdf vedo:

  • Mancante un bel condensatore 47..100 µF vicino all'alimentazione 5V wemos
  • Mancanti le resistenze in serie alle basi dei transistor
  • 5V prolungati direttamente verso i pulsanti distanti X metri (possibile via per disturbi condotti su alimentazione).

Non si può vedere naturalmente il percorso geometrico delle masse (possibile via per disturbi condotti sulla massa).

Non sappiamo se ci sono scintillazioni nei contatti dei relé per mancanza snubber o eccessivo tempo di apertura (qui è facile da capire, se senza carico non si blocca mai abbiamo un problema di scintille).

Non sappiamo se l'alimentazione è stabile o se dall'alimentatore entra qualche burst.

il condensatore sull'alimentazione manca , poi provo a inserirlo, le resistenze da quanto le metteresti? 10k?

Maggiore di 270 Ω, altrimenti troppa corrente per il wemos, ma non maggiore di 1200 Ω, altrimenti troppo poca corrente per il transistor (che sul collettore deve gestire circa 60 mA).

ok va bene intanto provo con il condensatore nell'alimentazione della wemos
grazie

In caso cambiando relè cosa consigliate, magari qualcosa di più piccolo come dimensioni, grazie

Al posto dei relè usa dei mosfet.

1 Like

Cosa mi consigli?
Altrimenti vedevo uln2803 ma da quello che ho capito è per 8 porte, mi servirebbe qualcosa per 2 o 4 relè