Arduino nana 33 iot hängt sich auf

Liebe Arduinofreund,
vor einiger Zeit ging unser Solarregler (Schüco Solo) kaputt. Da die Spannungsversorgung und ansonsten die Ausgänge in Ordung waren, baute ich stattdessen einen Arduino Nano 33 iot ein. Er sollte fortan die Eingangsdaten verarbeiten und den Ausgang für die Pumpe schalten.

Das Projekt wurde mithilfe der Arduino IoT Clout realisiert. Zum Programm: Ich hab 2 Eingänge, einmal den PT1000 Temperaturfühler von der Solar auf dem Dach, und einmal einen PT1000 unten vom Boiler (Warmwasserspeicher). Alle 6 Sekunden wird die Temperatur über die Analogen Eingänge gemessen. Ist die Temperatur auf dem Dach über 30 Grad und ist min. 10 Grad wärmer als die Boilertemperatur wird der interne Zähler i um 1 hochgezählt. Sobald dies min. 5 mal hintereinander eintritt schaltet die Pumpe ein.
Zusätzlich hab ich einen Zähler eingebaut der immer +1 zählt, wenn die Pumpe nicht läuft. Dieser ist für die Wintermonate gedacht, sodass die Pumpe mindestens 1 pro Tag für 5 Sekunden läuft (Schutz vor Festsetzen).
Soweit so gut. Mein Problem ist nur, dass der Arduino sporatisch sich aufhängt. Mal dauert es 8 Stunden mal hält er 2 Tage durch. Tritt dies ein, kann man ich immer noch über einen Laptop mit CMD anpingen. Er ist also an, und mit dem Internet verbunden.

Folgendes ist mir auch aufgefallen: Er hat auch aussetzer, wie gestern abend zwischen 20:34 & 22:24. In diesem Zeitraum hat er keine Daten Hochgeladen, lief aber dann nach 22:24 bis 22:47 "Normal".
grafik

Anbei die Verdratung:

Anbei noch der Programmcode: 'Solar'
</*
Sketch generated by the Arduino IoT Cloud Thing "Untitled"
https://create.arduino.cc/cloud/things/1fbcadb2-aa0b-4429-933b-45eede4dca8b

Arduino IoT Cloud Variables description

The following variables are automatically generated and updated when changes are made to the Thing

float temperaturBoiler;
float temperaturDach;
int pumpenausgang;

Variables which are marked as READ/WRITE in the Cloud Thing will also have functions
which are called when their values are changed from the Dashboard.
These functions are generated with the Thing and added at the end of this sketch.
*/
#define PIN_SOLAR A0
#define PIN_BOILER A1
#define PIN_PUMPE 10

#include "thingProperties.h"

int zaehler=0;//Zählt immer nach 6 Sek. +1 (wenn ein Tag vorbei (14400), dann soll die Pumpe für 5 Sekunden laufen) (Schutz vor Festsetzen)
int i=0;//Zählt, wie oft Temperatur Solar>Temperatur Boiler ab >5 wird die Pumpe eingeschaltet, bis Temp.Boiler>Temp.Solar
unsigned long mytimer=0;//Variable um Timer zurückzusetzen

void setup() {
analogReference(AR_EXTERNAL);
pinMode(PIN_PUMPE,OUTPUT);
pinMode(PIN_SOLAR,INPUT);
pinMode(PIN_BOILER,INPUT);
// Initialize serial and wait for port to open:
// Serial.begin(9600);
// This delay gives the chance to wait for a Serial Monitor without blocking if none is found
delay(1500);

// Defined in thingProperties.h
initProperties();

// Connect to Arduino IoT Cloud
ArduinoCloud.begin(ArduinoIoTPreferredConnection);

/*
The following function allows you to obtain more information
related to the state of network and IoT Cloud connection and errors
the higher number the more granular information you’ll get.
The default is 0 (only errors).
Maximum is 4
*/
setDebugMessageLevel(2);
ArduinoCloud.printDebugInfo();
}

void loop() {
ArduinoCloud.update();
// Your code here

if (millis() > (6000 + mytimer))
{
mytimer=millis();
temperaturBoiler = analogRead(PIN_BOILER);//Temperatur Boiler wird ausgelesen
temperaturDach = analogRead(PIN_SOLAR);//Analogpin Temperatur Solar

temperaturBoiler = (temperaturBoiler-464)*1.1;//Temperatur Boiler wird ausgelesen
temperaturDach = (temperaturDach-464)*1.1;//Analogpin Temperatur Solar

if ((temperaturDach-10)>temperaturBoiler&&temperaturDach>30)
{
i++;
}
else
{
i=0;
pumpenausgang=0;
digitalWrite(PIN_PUMPE,LOW);
}

if (i>=5) //Aufgrund sproratischer Messschwankungen soll Pumpe erst einschalten, wenn 5-mal hintereinander Temp.Dach>Temp.Boiler
{
pumpenausgang=1;
digitalWrite(PIN_PUMPE,HIGH);
zaehler=0;
}

zaehler++;//Schutz vor Festsetzen der Pumpe
if (zaehler>=14400)
{
zaehler=0;
pumpenausgang=1;
delay (5000);
pumpenausgang=0;
}

}//end 6szeitverzögerung
if (millis()< mytimer)//sobald sich millis() nach 50 Tagen vollläuft (sich auf 0 setzt) wird der timer auch zurückgesetzt
{
mytimer=millis();
}
}//end loop

/*
Since Pumpenausgang is READ_WRITE variable, onPumpenausgangChange() is
executed every time a new value is received from IoT Cloud.
*/
void onPumpenausgangChange()
{
// Add your code here to act upon Pumpenausgang change
}>

Die Additions-Methode versagt.
Siehe hier

Auch das scheint mir bedenklich.
Glaube nicht, dass das Sinn macht.

Ich vermisse am Relais die Freilaufdiode.
Und an der Pumpe brauchst du vermutlich auch einen Snubber.

Hallo,
wenn Du schreibst "er hängt sich auf" was meinst Du damit ? Das versenden der Daten klappt ja dann anscheinend zeitweise nicht mehr, ( siehe Deine Grafik) Anscheinend hat er ja dann später wieder was gesendet. Was ist Mit Deinem Programmteil für die Pumpen , läuft das normal weiter oder steht das auch.
Es macht sicher Sinn wenn Du ein paar Serial.print mit einbaust um zu sehen wo es hängt. Zudem wird einen blinkende LED auch schon mal helfen um zu sehen ob der loop normal weiter läuft. Dazu muss aber das delay(5000) raus und durch millis ersetzt werde. Die übrigen Zeitabfragen mit millis() solltest Du dann auch auf einen richtigen Stand bringen.
Du konntest auch erst mal auf das ganze Internet gedönse verzichten und nur das Thema Pumpen laufen lassen. Wer sagt denn das in der lib kein Bock ist. Was ich damit sagen will , vermutlich musst Du schrittweise vorgehen um den Fehler zu finden.
Heinz

Und der Basiswiderstand vorm Darlington

Stimmt genau.

Vielen Dank für diese große Rückmeldung.

@combie: ich hab inzwischen die Substitutionsvariante eingebaut:

<if ((millis() - mytimer) >= 6000)
{>...
auch hab ich den "if millis()<mytimer" Teil komplett gelöscht.

Außerdem hab ich einen 1k Basis-Widerstand vor die Darlingtonschaltung gelötet.

@Rentner:
Ich hab zunächst einmal eine LED zum blinken gebracht im loop. Diese schaltet die eingebaute LED auf 13 ein und aus.

Wie müsste ich eigenlich Serial.Print realisieren? ich müsste doch dann einen Laptop mit Hilfe des Kabels mit dem Arduino verbinden und die nächsten Stunden/Tage im Betriebsmodus belassen? Gibt es da auch eine elegantere Lösung?

Ja.
Es gibt natürlich andere Varianten Z.B auf einen SD carte schreiben in eine TXT Datei. Ist aber alles aufwendiger.

Fehlt immer noch die Freilaufdiode.
Und deine Rechnung mit der Trafospannung und der entstehenden Gleichspannung kann so nicht stimmen.
Bei 9 V AC sind das fast 13V DC.
Das sind dann für deinen Arduino vermutlich schon zu viel !?

Stimmt, es müssen natürlich 13 V sein. Diese sollte aber der Arduino Nano abkönnen, schließlich ist er laut Datenblatt mit 5V-21V angegeben.

Eine Freilaufdiode ist inzwischen auch eingelötet :+1:

Stimmt, habe ich auch gerade gesehen. Sollte so funktionieren. Ob da dann allerdings dein Elko mit 30µ ausreicht, wage ich zu bezweifeln. Den würde ich mal größer ansetzen.
Warum baust du da keinen Spannungsregler mit ein ? Hätte ich jetzt mal mit vorgesehen.

Ich hab einfach keinen Spannungsregler da, sonst wäre das einen Versuch wert.

Ich hab jetzt zusätzlich zum 30µF Kondensator noch einen 220µF Kondensator parallel geschalten.

Ich werd jetzt mal abwarten, ob das Problem überhaupt noch auftritt.

Ok, 220 µF sind schon mal besser als 30µF.

PT1000 mit 10 bit auslesen ist schlechte Idee 10° unterschied machen gerade 39 Ohm.
Rechne Aufwand für NTC ist der gleiche und bei 10 bit viel genauer. Noch besser wehre ein DS18b20. NTC und DS gibt's auch konfektioniert .

Danke für diesen Hinweis. Mir ist bewusst, dass der PT1000 nicht optimal ist. Leider sitzt dieser auf dem Hausdach an den Solar-Modulen. Ich kann diesen nicht einfach austauschen.
Für meine Anwendung ist dieser genau genug. In den Nächten gibt dieser die Außentemperatur wieder, und die Temperatur am Tag stimmt mit der Wassertemperatur am Rücklauf auch gut überein.

Messwandler vorher ran.

Nicht ganz
9V * SQR(2) - 2*0,7V = 11,3V.
0,7V kommen von den Gleichrichterdioden.

andererseits sind 30µF zu wenig für die Glättung;

Andererseits hat der TO einen Arduino NANO 33 IOT https://content.arduino.cc/assets/NANO33IoTV2.0_sch.pdf den MPM3610, einen DC/DC Wandler mit integrierter Spule und Eingengsspannung von 4,5V bis 21V. https://www.monolithicpower.com/en/documentview/productdocument/index/version/2/document_type/Datasheet/lang/en/sku/MPM3610GQV-Z/document_id/2090

Für den PT1000 würde ich einen MAX31865 (Achtung Version für PT1000 kaufen) nehmen und möglichst mit 3 oder 4 Wire Anschluß.

Grüße Uwe

Danke Uwe, das mit der Spannung am Nano hatte ich schon berichtigt.

Entschuldige; hatte ich überlesen.
Uwe

Dein Nano 33 IoT hat 12 Bit Auflösung somit genauer, dadurch ist mein Beitrag #14 ein wenig falsch wen es geht um die Temp. Auflösung.