Problemi di blocco e watchdog su Attiny85

Ho realizzato, da diverso tempo, una sonda Umidità/Temperatura usando un sensore AHT20 che viene letto da una schedina Attiny85.
I dati rilevati vengono poi mandati ad un classico PLC industriale tipo Mitsubishi attraverso un semplicissimo protocollo:

  • ho tre cifre per l'umidità (per esempio 57,4 %) e tre cifre per la temperatura (per esempio 35,6 'C)
  • invio 5 impulsi, pausa, poi 7 impulsi, pausa, poi 4 impulsi, pausa poi 3 impulsi, pausa, eccetera.
  • il PLC legge quindi questi treni di impulsi da uno dei suoi ingressi digitali e ricompone i due valori di umidità e temperatura.
    Il quadro elettrico dove lavora la sonda contiene anche un inverter che è fonte di disturbi.

Il problema è che, a volte, la schedina si blocca ! Rimane congelata! (forse la causa è l'inverter).
Un successivo riavvio rimette tutte le cose a posto.
Esistono alcune schedine che invece non hanno questo tipo di problema.

Ho provato a mettere un wachtdog, ma evidentemente non funziona perché la schedina non si riavvia.

Qualche anima pìa potrebbe controllare il programma e consigliarmi le opportune modifiche?
Grazie in anticipo.

#include <Wire.h>
#include <SparkFun_Qwiic_Humidity_AHT20.h> //Click here to get the library: http://librarymanager/All#Qwiic_Humidity_AHT20 by SparkFun

#define PIN 1

AHT20 humiditySensor;

int del = 12;   // pausa tra On e Off
int del1 = 33;  // pausa tra CIFRE
int del2 = 100;  // pausa tra Letture

float RH = 0;
float T = 0;

bool lettura;

int i = 0;
int ii = 0;
int r33 = 0;
int t33 = 0;

int r[7];

void setup()
{
  wdt_disable();

  Wire.begin(); //Join I2C bus
  pinMode (PIN, OUTPUT);
  digitalWrite(PIN, LOW);

  wdt_enable(WDTO_2S);  // Set watchdog to 2 second

  if (humiditySensor.begin() == false)
  {
    digitalWrite(PIN, HIGH);
    Serial.println("AHT20 not detected. Please check wiring. Freezing.");
    while (1);
  }
  Serial.println("AHT20 acknowledged.");
}

void loop()
{
  wdt_reset();

  if ((lettura == 1) && (humiditySensor.available() == true)) {

    RH = humiditySensor.getHumidity();
    T = humiditySensor.getTemperature();

    RH = RH * 10;
    T = T * 10;
    r33 = RH;
    t33 = T;

    r[1] = RH / 100;
    r[2] = RH / 10; r[2] = r[2] - (r[1] * 10);
    r[3] = r33 - ((r33 / 10) * 10);

    r[4] = T / 100;
    r[5] = T / 10; r[5] = r[5] - (r[4] * 10);
    r[6] = t33 - ((t33 / 10) * 10);

    lettura = 0;
  }

  for (ii = 1; ii <= 6; ii++) {

    for (i = 0; i <= r[ii]; i++) {
      digitalWrite(PIN, HIGH);
      delay(del);
      digitalWrite(PIN, LOW);
      delay(del);
    }
    delay (del1);
  }
  delay(del2);
  lettura = 1;
}

Ma il watchdog da solo funziona?

Si, funziona, se in fondo metto un delay (3000); la scheda continua a riavviarsi.

Che resistenza c'è tra il positivo ed il reset (pin1,PB5)? Io intanto proverei ad abbassarla, o se non lo devi programmare anche direttamente sul postivo. Poi, ferriti sui cavi di alimentazione.

Ciao, Ale.

Nessuna resistenza.
Ho lasciato la schedina come mamma l'ha fatta.
Cattura

Allora ti va già bene quando funziona..., il pullup interno è piuttosto debole.

Ciao, Ale.