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;
}
