Servus,
ich will (muss) ne Wetterstation bauen mit meinem Arduino DUE, Sensoren auselesen und Hintergrundbild laden geht schon (screen1.
Nun will ich einen Screen2 machen in dem man ne Uhrstellen kann oder die IP EInstellungen von meinem Ethernet Shield 2 ändern kann, bevorzugt erreichbar über einen Interrupt.
Jedoch beim test läuft mein Programm direkt in den Screen2 und bleibt dort hängen obwohl Pin8 direkt auf +3,3V liegt.
Hat jemand eine Erklärung dafür?
[code]
/*
Vorgaben:
- Wetterstation Temperatur, Luftdruck, Luftfeuchtigkeit über I²C
- Echtzeituhr mit Timerbaustein und absicherung AKKU
- Firmenloge Rechtsoben in der Ecke und am besten Beim Booten
- Setup für IP Einstellungen
- Erweiterbar für Kalibrierungen sein
- Touchscreen und Stouch haben
https://www.itead.cc/wiki/ITDB02-5.0
https://www.conrad.de/de/uhr-zeitnahme-ic-echtzeituhr-stmicroelectronics-m41t11m6f-uhrkalender-so-8-1185347.html
*/
#include <UTFT.h>
#include<URTouch.h>
#include <SPI.h>
#include "SdFat.h"
#include <UTFT_SdRaw.h>
#include <Wire.h>
// Einbinden der Bibliotek
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t GroteskBold24x48[];
//Laden der Schriftarten
UTFT myGLCD(ITDB50,43,45,47,49);
URTouch myTouch( 38, 40, 42, 46, 48);
//Anzeige Konfigurieren
UTFT_SdRaw myFiles(&myGLCD);
#define SD_CHIP_SELECT 0 // SD Auswahlpin
SdFat sd;
//SD-Konfigurieren
#define Addr 0x27
//Sensor Adresse Setzen
int s=0;
int i=0;
int x,y;
float a=0;
float b=0;
float wert=0;
//Variablen
void setup()
{
pinMode(8, INPUT);
digitalWrite(8, HIGH);
myTouch.InitTouch();
!sd.begin(SD_CHIP_SELECT, SPI_FULL_SPEED); // Starten der SD
Wire.begin(); //Starte I2C
myTouch.setPrecision(PREC_HI); //setze Präzision hoch
myGLCD.InitLCD(LANDSCAPE);
myFiles.load(0, 0, 800, 480, "ETH_logo_mHg2.RAW", 1 ); //Bildschirm starten und die Datei laden
delay(3000);
myGLCD.clrScr();
screen1();
analogReadResolution(12); //Einstellen auf Analogread von 2 hoch 12 also 4096 Werten
attachInterrupt(digitalPinToInterrupt(8), screen2, FALLING);
}
void loop()
{
analog();
tmp_lesen ();
}
void Temperatur () //Einstellen des Temperaturfensters
{
myGLCD.InitLCD(LANDSCAPE);
myGLCD.setColor(VGA_WHITE);
myGLCD.fillRect(0,0 , 399, 240);
myGLCD.setFont(GroteskBold24x48);
myGLCD.setBackColor(VGA_WHITE);
myGLCD.setColor(0,0,139);
myGLCD.print("Temperatur", 75, 20 );
}
void Luftdruck ()//Einstellen des Luftdruckfenster
{
myGLCD.InitLCD(LANDSCAPE);
myGLCD.setFont(GroteskBold24x48);
myGLCD.setBackColor(VGA_WHITE);
myGLCD.setColor(VGA_LIME);
myGLCD.print("Luftdruck", 485, 260 );
}
void Luftfeuchtigkeit ()//Einstellen des Luftfeuchtefenster
{
myGLCD.InitLCD(LANDSCAPE);
myGLCD.setFont(GroteskBold24x48);
myGLCD.setColor(VGA_YELLOW);
myGLCD.setBackColor(VGA_WHITE);
myGLCD.print("Luftfeuchte", 70, 260 );
}
void ETH () //Einstellen des ETH_Fenster
{
myGLCD.InitLCD(LANDSCAPE);
myFiles.load(400, 0, 800, 240, "ETH3.RAW", 1 );
myGLCD.setColor(VGA_WHITE);
myGLCD.fillRect(401,100 , 500, 230);
myGLCD.setColor(145, 222, 179); //Benutze wheat
myGLCD.fillRect(490,182 , 680, 218);
myGLCD.setFont(BigFont);
myGLCD.setBackColor(145, 222, 179);
myGLCD.setColor(255, 127, 80); //Benutze Coral
myGLCD.print("Einstellung",500 , 192);
}
void screen1()
{//Laden des normalscreens
myGLCD.clrScr(); //Bildschirmlöschen
myGLCD.fillScr(VGA_WHITE);
myGLCD.InitLCD(LANDSCAPE);
ETH();
Temperatur();
Luftdruck();
Luftfeuchtigkeit();
myGLCD.setColor(VGA_BLACK);
myGLCD.drawLine(400,0,400,480);
myGLCD.drawLine(0,240,800,240);
}
void screen2 () //Laden des Einstellungfenster
{
myGLCD.fillScr(VGA_SILVER);
delay(300);
screen1();
}
void analog() //Einlesen Luftdruck
{
/* Berechnung:
* a= U(a11)/ (3,3V/4096); aufgrund des 12 bit 2^12=4096; 3,3V max Spannung
* +253 ist der offset von 0,2V /(3,3V/4096)
* 0,394933364 Umrechnung auf den Druck; 3,3V= 1617,647059hPa somit 1617,647059hPa/4096=0,394933364
*/
myGLCD.setFont(GroteskBold24x48);
myGLCD.setBackColor(VGA_WHITE);
a=analogRead(A11)+253;
b=a*0.394933364;
myGLCD.setColor(VGA_LIME);
myGLCD.printNumF(b, 2, 485, 350);
myGLCD.print("hPA", 635, 350 );
delay(300);
}
void tmp_lesen ()
{
unsigned int data[4];
Wire.beginTransmission(Addr); //Start I²C
Wire.write(0x00); //Datenregister 0x00
Wire.endTransmission(); //Beende Übertragung
Wire.requestFrom(Addr, 4); // Request 4 bytes of data
if (Wire.available() == 4)// Read 4 bytes of data
{ // humidity msb, humidity lsb, temp msb, temp lsb
data[0] = Wire.read();
data[1] = Wire.read();
data[2] = Wire.read();
data[3] = Wire.read();
}
// Convert the data to 14-bits
float humidity = ((((data[0] & 0x3F) * 256) + data[1]) * 100.0) / 16383.0;
int temp = ((data[2] * 256) + (data[3] & 0xFC)) / 4;
float cTemp = (temp / 16384.0) * 165.0 - 40.0; //Umrechen in grad C
// Daten Ausgeben
myGLCD.setFont(GroteskBold24x48);
myGLCD.setColor(VGA_YELLOW);
myGLCD.setBackColor(VGA_WHITE);
myGLCD.printNumF(humidity, 2, 70, 350);
myGLCD.print(" %RH ", 210, 350 );
myGLCD.setFont(GroteskBold24x48);
myGLCD.setColor(0,0,139);
myGLCD.setBackColor(VGA_WHITE);
myGLCD.printNumF(cTemp, 2, 75, 110);
myGLCD.print(" C ", 210, 110 );
delay(300);
}
[/code]