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".
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
}>