Programm will nicht so wie ich will.

Hallo

Hardware:
Mega2560 ,
SainSmart 3.2" TFT LCD Display + TFT LCD Shield for Arduino Mega 2560
DS18b20 Temp.Fühler
RTC DS 3231

Software:
Ich - Martin und meine Fische :slight_smile:

Gebaut wird Aquariumsteuerung die Dritte.
Zur erklärung erste 2 sind schon gebaut und laufen über 1 Jahr so stabill dass man auf den Watchdog sogar verzichten kann. Es sind allerding jeweils OLED Bildschirme, und Taster statt TouchScreen.

Stabilität ist mein Problemm.

Program soll vorerst so ablaufen:
Page1 ->Page2 ->Pagex …-Page1… und alles Steuern solange niemand was gerdrückt hat.
So weit bin ich leider noch nicht, weil nur der Teil der aus 2 Seiten besteht und soll sie wechseln, noch ohne den Touch, oder Steuerung von irgend was funktioniert Über die Nacht nicht (Bleibt Hängen).

Was schon ausprobiert:

Anzeigedauer von Pages mittels millis weitergeschaltet, mittels “normalen” Variable die in der schleife bis bestimmte Grösse zählt dann weiter, letztens habe ich die Anzeigedauer an sekundentakt vom rtc gebunden (wie mit millis nur nicht so schnell).Alles das hat nichts gebracht. Bleibt stehen - mal nach 1 Stunde, mal nach 3, mal früher. Auch noch an “Auslesefrequenz” von RTC und DS18b20 gebastelt - keine Besserung. Jetzt kommts -Wenn mann nur eine Seite laufen lässt (Ohne umschaltung) rennt das Ding schon 7 Tage störungsfrei.
Um missverständnisse zu vermeiden der Bildschirm ist kein CPLD - sondern ganz normalles DS18b20 controled Touch. mit Pagewechsel meine ich dass ich alte Inhalt mittels myglcd.fillrect Black lösche (Drumherumm gibt es statusleisten oben und unten- die sollen nicht gelöscht werden). Tupfergleiche
Seite ohne umschaltung leuft störungsfrei.
Ne Idee warum die Umschaltung nach so kurze Zeit zum Absturz führt?

Anbei “Draft” Sketch

bausteine.ino (1.46 KB)

berechnungen.ino (118 Bytes)

helfer.ino (2.52 KB)

pages.ino (2.88 KB)

UTFT_CPLD_PageSwitching.ino (1.36 KB)

So groß sind Deine Programmbausteine nicht, dass sie nicht sichtbar in den Beitrag eingestellt werden können. Also tu das bitte und setze sie dabei in Codetags (</> oben links). So können sie alle lesen. Anhänge werden nur selten gelesen.

Ohne mir Deine Teile angeschaut zu haben, wäre es evtl. sinnvoll erst mal Teile einzeln zu testen, also z.B. nur der Seitenaufbau und die Seitensteuerung.
Die Temperaturmessung hast Du ja wohl schon bei den beiden anderen Steuerungen genutzt. Die DS3231 auch?

So ist der Fehler besser eingrenzbar.

Gruß Tommy

Hallo,
Zum erstem - so spukt es Atmel Studio raus. Ich versuche es “zusammenzukleben”.
Zum Zweitem:
Am Fehlereingrenzen binn Ich schon mittlereweile 2-te Woche. Schön mühsam nach der Art abends was zusammenbasteln - morgens auf die Arbeit. Meistens den Abend leuft es noch, aber am nächstem Morgen nicht, und von vorne…

Habe auch im erstem Post geschrieben - die gleiche Seite mittels “while (1)” in bewegung gesetzt rennt immer noch - seit 7 Tage - mit gleichen gebern. Und so lange es leuft (mit umschaltung) - leuft es - Ohne sichtbaren Störungen schaltet braw weiter sogar die anzeigezeit wird braw beachtet. Und morgens ist entweder Anzeige weiss oder eingefroren.

für die Hilfe schon mal Danke. MarTiN

PS. Habe den Code doch kürzen müssen - über 9000 Zeichen gesammt.

#include <UTFT.h>
#include <DS3231.h>
#include <OneWire.h>			//für temperaturmessung
#include <DallasTemperature.h>


// Declare which fonts we will be using
extern uint8_t BigFont[];
extern uint8_t SmallFont[];
//extern uint8_t SevenSegNumFont[];


UTFT myGLCD(SSD1289,38,39,40,41);
DS3231  rtc(SDA, SCL);											// Init the DS3231 using the hardware interface
Time  t;
OneWire  ds(19);
#define ONE_WIRE_BUS 19				/* Digitalport Pin 19 definieren für temperaturmessung*/

OneWire ourWire(ONE_WIRE_BUS);		/* Ini oneWire instance */

DallasTemperature sensors(&ourWire);/* Dallas Temperature Library für Nutzung der oneWire Library vorbereiten */
byte Thermo1[8] ={0x28, 0xFF, 0xB0, 0xA2, 0x58, 0x16, 0x04, 0xD0};
byte Thermo2[8] ={0x28, 0xFF, 0x63, 0xAB, 0x61, 0x16, 0x03, 0x80};


long ist_zeit_sek;
unsigned long ds_millis=0, rtc_millis=0 ;// wie oft werte abholen (nur startzahlen im unterprogramm selbst änderbar


float temperatur_in , temperatur_out,soll_temperatur_in=23;
int abweichung=1;
byte alarm , altealarm=254;
word rahmenfarbe=VGA_WHITE;
String rahmentext="Anlauf";





void setup()
{
	myGLCD.InitLCD(1);
	myGLCD.clrScr();
	delay(200);
	rtc.begin();
	sensors.begin();						//dallas temp
	sensors.setResolution(Thermo1, 11);
	sensors.setResolution(Thermo2, 9);
	
	myGLCD.setDisplayPage(4);
	myGLCD.setWritePage(4);

}

void loop()
{
    page1_1();

}


void zeitabholen(){
	
	//long rtc_warte=50;//intervall
	
	
	//if ((millis() - rtc_millis > rtc_warte))
	//{
		t = rtc.getTime();	
		//sekundy();
		//zeit vom chip abholen
		//rtc_millis=(millis());
	//}
	
	//gedr();	//bildschirm berührt?
	
	

}
void tempabholen(){
	long ds_warte=10000;
	if ((millis() - ds_millis > ds_warte))
	{
		//sensors.setWaitForConversion(false);
		sensors.requestTemperatures();
		temperatur_in= sensorValue(Thermo1);
		temperatur_out=sensorValue(Thermo2);
		ds_millis=(millis());
	}
	
	// gedr();	//bildschirm berührt?
}
void temperaturabgleich ()//gleichzeitig überwachung (alarm setzen was tun - heizen/kühlen)	
{  
	//myGLCD.setColor(VGA_WHITE);
	
	if ((temperatur_in)<= (soll_temperatur_in-abweichung))
	{alarm=1;}
	if ((temperatur_in)>= (soll_temperatur_in+abweichung))
	{alarm=2;}
	if ((temperatur_in)>(soll_temperatur_in-abweichung)&& (temperatur_in<(soll_temperatur_in+abweichung)))
	{alarm=0;}
	
}



void uhrgrafik(int y,word farbe){
	myGLCD.setColor(farbe);
	myGLCD.drawRect(0,y,319,y+4);
	
	if ((t.min)%2 ==0)		//balken invers wenn minute gerade
	{
	myGLCD.setColor(VGA_BLACK);
	}
	
	myGLCD.fillRect(1,y+1,t.sec*5.42,y+3);
}
void UhrGrossFarbig(int x,int y,word farbe){
	
	
	
	myGLCD.setColor(farbe);
	
	myGLCD.setFont(BigFont);
	myGLCD.printNumI((t.hour),x,y,2);
	myGLCD.print(":",x+30,y);
	myGLCD.printNumI((t.min),x+43,y,2,48);// x,y,vorstellen, filler 48=0
	myGLCD.print(":",x+73,y);
	myGLCD.printNumI((t.sec),x+86,y,2,48);
}
void tempausgabegross(){
	myGLCD.setColor(VGA_WHITE);myGLCD.setFont(BigFont);
	myGLCD.print("TempIN :",15,135);
	
	if ((temperatur_in)<= (soll_temperatur_in-abweichung))
	{myGLCD.setColor(VGA_BLUE);}
	if ((temperatur_in)>= (soll_temperatur_in+abweichung))
	{myGLCD.setColor(VGA_RED);}
	if ((temperatur_in)>(soll_temperatur_in-abweichung)&& (temperatur_in<(soll_temperatur_in+abweichung))){myGLCD.setColor(VGA_LIME);}
	myGLCD.printNumF(temperatur_in,2,144,135,46,2);
	myGLCD.setColor(VGA_WHITE);
	myGLCD.print("(",240,135);
	myGLCD.printNumI(soll_temperatur_in,256,135,2,46);
	myGLCD.print(")",288,135);
	
	myGLCD.print("TempOUT:",15,151);
	
	myGLCD.printNumF(temperatur_out,2,144,151,46,2);
	
}
void rahmen()
{/*
	
	myGLCD.setColor(rahmenfarbe);
	for (int a=0;a < 14; a=a+1)
	{
		myGLCD.drawRect(a,a,319-a,239-a);
	}
	myGLCD.setFont(SmallFont);
	myGLCD.print(rahmentext,CENTER,227);
*/
myGLCD.setColor(rahmenfarbe);		//nur waagerechte statuszeilen

	myGLCD.fillRect(0,0,319,14);
	myGLCD.fillRect(0,226,319,239);

myGLCD.setFont(SmallFont);
myGLCD.print(rahmentext,CENTER,227);
}
void RahmenUhr(int x,int y){		//uhr Farbe global
	
	//myGLCD.getColor();
	
	myGLCD.setFont(SmallFont);
	myGLCD.setColor(rahmenfarbe);
	myGLCD.printNumI((t.hour),x,y,2);
	myGLCD.print(":",x+16,y);
	myGLCD.printNumI((t.min),x+24,y,2,48);// x,y,vorstellen, filler 48=0
	myGLCD.print(":",x+40,y);
	myGLCD.printNumI((t.sec),x+48,y,2,48);
	
	
}
void RahmenTemp(int x,int y){

	myGLCD.setFont(SmallFont);
	myGLCD.print(" ",x,y);myGLCD.printNumF(temperatur_in,2,x+8,y,46,2);myGLCD.print("Grad C ",x+48,y);
}
void titelrahmen(word hintfarbe,word txtfarbe,String titel){
	myGLCD.setColor(hintfarbe);
	myGLCD.fillRoundRect(0,16,319,38);
	myGLCD.setColor(txtfarbe);
	myGLCD.drawRoundRect(0,16,319,38);
	myGLCD.setFont(BigFont);
	myGLCD.setBackColor(hintfarbe);
	myGLCD.print(titel,CENTER,19);
	myGLCD.setBackColor(VGA_BLACK);
}
void clsmitte(){
	myGLCD.setColor(VGA_BLACK);
	myGLCD.fillRect(0,40,319,219);
	
	
}

void page1_1(){
	
	zeitabholen();
	unsigned int startzeit = t.sec;tempabholen();
	temperaturabgleich();
	titelrahmen(VGA_GREEN,VGA_LIME,"1.1 Datum/Temp");
	do
	{
		
		zeitabholen();
		tempabholen();
		temperaturabgleich();  //isttemp,solltemp,max abweichung
		alarmauswertung();
		RahmenUhr(14,1);RahmenTemp(202,1);
		myGLCD.printNumI(sekundy(),(RIGHT),227,6);
		uhrgrafik(220,rahmenfarbe);
		myGLCD.setFont(BigFont);
		switch(t.dow)
		{
			case 1:
			myGLCD.setColor(VGA_AQUA);
			myGLCD.print("Montag",CENTER,47);
			break;
			case 2:
			myGLCD.setColor(VGA_AQUA);
			myGLCD.print("Dienstag",CENTER,47);
			break;
			case 3:
			myGLCD.setColor(VGA_AQUA);
			myGLCD.print("Mittwoch",CENTER,47);
			break;
			case 4:
			myGLCD.setColor(VGA_AQUA);
			myGLCD.print("Donnerstag",CENTER,47);
			break;
			case 5:
			myGLCD.setColor(VGA_AQUA);
			myGLCD.print("Freitag",CENTER,47);
			break;
			case 6:
			myGLCD.setColor(VGA_AQUA);
			myGLCD.print("Samstag",CENTER,47);
			break;
			case 7:
			myGLCD.setColor(VGA_RED);
			myGLCD.print("Sonntag",CENTER,47);
			break;
		}
		
		myGLCD.setColor(VGA_AQUA);
		myGLCD.printNumI(t.date,CENTER,63,2);
		myGLCD.print(rtc.getMonthStr(),CENTER,79);
		myGLCD.printNumI(t.year,(CENTER),95,2);
		
		UhrGrossFarbig(100,113,VGA_YELLOW);
		tempausgabegross();
		//myGLCD.printNumI(ist_zeit_sek,(CENTER),200,5);
		
		
		
		
		
		}
	while ((t.sec-startzeit) < 5);
	
	clsmitte();
	
	
	//delay(500);
	page1_2();
	}
	
void page1_2(){
	unsigned int startzeit = t.sec;
	zeitabholen();
	tempabholen();
	temperaturabgleich();
	titelrahmen(VGA_GREEN,VGA_LIME,"1.2");
	do
	{
		
		zeitabholen();
		tempabholen();
		temperaturabgleich();  //isttemp,solltemp,max abweichung
		alarmauswertung();
		RahmenUhr(14,1);RahmenTemp(202,1);
		myGLCD.printNumI(sekundy(),(RIGHT),227,6);

		uhrgrafik(220,rahmenfarbe);
		/*myGLCD.setFont(BigFont);
		switch(t.dow)
		{
			case 1:
			myGLCD.setColor(VGA_AQUA);
			myGLCD.print("Montag",CENTER,47);
			break;
			case 2:
			myGLCD.setColor(VGA_AQUA);
			myGLCD.print("Dienstag",CENTER,47);
			break;
			case 3:
			myGLCD.setColor(VGA_AQUA);
			myGLCD.print("Mittwoch",CENTER,47);
			break;
			case 4:
			myGLCD.setColor(VGA_AQUA);
			myGLCD.print("Donnerstag",CENTER,47);
			break;
			case 5:
			myGLCD.setColor(VGA_AQUA);
			myGLCD.print("Freitag",CENTER,47);
			break;
			case 6:
			myGLCD.setColor(VGA_AQUA);
			myGLCD.print("Samstag",CENTER,47);
			break;
			case 7:
			myGLCD.setColor(VGA_RED);
			myGLCD.print("Sonntag",CENTER,47);
			break;
		}
		
		myGLCD.setColor(VGA_AQUA);
		myGLCD.printNumI(t.date,CENTER,63,2);
		myGLCD.print(rtc.getMonthStr(),CENTER,79);
		myGLCD.printNumI(t.year,(CENTER),95,2);
		
		UhrGrossFarbig(100,113,VGA_YELLOW);
		tempausgabegross();
	myGLCD.setFont(BigFont);myGLCD.setColor(VGA_PURPLE);
	myGLCD.printNumI(sekundy(),(CENTER),200,5);*/
	
	}
	while ((t.sec-startzeit) < 5);
	//delay(500);
	clsmitte();
	page1_1();
}

Die vielen auskommentierten Zeilen machen es nicht gerade übersichtlicher.
Was mir beim ersten grobern Drüberschauen auffällt:

Die DS82B20 im blockierenden Modus brauchen etwas 700 ms, bis ein Wert bereit steht.
Im nichtblockierenden Modus musst Du selbst diesen Zeitabstand zwischen Request und lesen sicherstellen.
//sensors.setWaitForConversion(false); hast Du ja auskommentiert. Wenn, dann würde ich es ins Setup tun.

Du rufst die Temperaturmessung und regelung ja fast dauernd auf (die Zeitsteuerung ist auskommentiert).
So schnell ändern sich Temperaturen (besonders im Wasser) nicht. Da sollte eine Abfrage pro Minute, besser 5 Minuten ausreichen. auch für die Regelung.
Deine Heizung wird ja nicht das Wasser in 2 Sekunden um 10 K aufheizen.

Mit TFT kenne ich mich nicht aus, da gibt es bessere Helfer. Ich würde aber erst mal ein sauberes Zeitmanagement aufsetzen ohne blockierende Sensorabfragen.

Gruß Tommy

hallo

Das viele "Auskommentierte" liegt daran, dass ich versuche der Sache an den Grund zu kommen.
Mal wird so probiert, mal anders. Möchte nicht jedes mal alles neu schreiben.

Zum blokieren: Den DS hatte ich schon mit 10 sek von Abfrage zu Abfrage am laufen,genauso den RTC. Gebracht hat es nichts daher wieder Auskommentiert.
Andersrum wenn sich die Seite nicht wechselt funktioniert es auch so (ohne die extra wartezeiten am RTC und DS) schon 7-te Tag.Das die Temperatur sich so schnell nicht wechselt ist mir klar. Das kurze interval ist nur für versuchszwecke (ob sich der Alarm ändert usw. Mache es bloss abends - da kann Ich nicht 5 min warten um zu prüffen ob sich zb die Farbe mit Temp. ändert.

Trotzdem danke
MarTiN