Guten Tag zusammen,
ich betreibe an meinem Arduino Uno eine kleine Wetterstation. Es werden Sensoren ausgelesen und die Werte auf einem LCD-Display ausgegeben. Außerdem kommt ein Ethernet Shield zum Einsatz (W510).
Einzeln funktioniert alles ganz gut soweit. Auch kann ich alle Sensoren (PT100 Messwandler, DHT22, Anemometer) und das Display simultan betreiben. Sobald aber das Ethernet Shield dazu kommt, wird der Code nicht mehr richtig ausgeführt.
Sensoren + Display: Alles top
Sensoren + Display + Ethernet: Weder Display- noch Browserfunktion
PT100 Messwandler + Display + Ethernet: Display läuft, Browser läuft sporadisch. Wenn ich zunächst den Sensorcode auskommentiere und die Seite lade, kann ich sogar mit dem Messwandler- und dem Anemometercode die Seite erneut laden.
DHT22 + Ethernet: Seite lädt nicht.
Für mich sieht das nach einem Speicherproblem aus. Der Compiler sagt auch, dass der Speicher zu 85 % voll ist.
Was meint ihr? Vielen Dank schon mal im Voraus.
#include "DHT.h"
#include "Wire.h"
#include "LiquidCrystal_I2C.h"
#include "SPI.h"
#include "Ethernet.h"
#include "SD.h"
#define DHTPIN 9
#define DHTTYPE DHT22
#define BACKLIGHT_PIN 7
byte mac[]={0xBA, 0x86, 0x57, 0x2D, 0x90, 0x55};
IPAddress ip(192,168,0,24);
EthernetServer server(80);
LiquidCrystal_I2C lcd(0x27);
DHT dht(DHTPIN, DHTTYPE);
//Temperatur
float temperatur=0.0;
//Feuchtigkeit
float feuchtigkeit=0.0;
//Windgeschwindigkeit
const int m_time = 5;
int wind_ct = 0;
float windgeschwindigkeit = 0.0;
unsigned long time = 0;
//Windrichtung
int cny1, cny2, cny3;
String windrichtung;
String wr;
// size of buffer used to capture HTTP requests
#define REQ_BUF_SZ 50
File Datei;
char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string
char req_index = 0; // index into HTTP_req buffer
void setup() {
Serial.begin(9600);
Ethernet.begin(mac, ip);
server.begin();
dht.begin();
time = millis();
//Digitale Eingänge zum Messen der Windrichtung
pinMode(1, INPUT);
pinMode(2, INPUT);
pinMode(3, INPUT);
pinMode(BACKLIGHT_PIN, OUTPUT);
digitalWrite(BACKLIGHT_PIN, HIGH);
lcd.begin(16,2);
//Abfrage ob SD-Karte gefunden wird
if(!SD.begin(4)) {
Serial.println("SD-Karte nicht gefunden!");
}
//Abfrage, ob Datei gefunden wird
if(!SD.exists("index.htm")) {
Serial.println("Datei nicht gefunden!");
}
}
void loop() {
messen_Temperatur();
messen_Feuchtigkeit();
messen_Geschwindigkeit();
//messen_Windrichtung();
//webBrowser();
Display_Ausgabe();
}
void webBrowser(){
EthernetClient client = server.available();
if(client) {
boolean currentLineIsBlank = true;
while(client.connected()) {
if(client.available()) {
char c = client.read();
if(req_index < (REQ_BUF_SZ - 1)) {
HTTP_req[req_index] = c;
req_index++;
}
if(c == '\n' && currentLineIsBlank) {
client.println("HTTP/1.1 200 OK");
if(StrContains(HTTP_req, "ajax_inputs")) {
client.println("Content-Type: text/xml");
//client.println("Connection: keep-alive");
client.println("Connection: close");
client.println();
XML_response(client);
}
else {
client.println("Content-Type: text/html");
//client.println("Connection: keep-alive");
client.println("Connection: close");
client.println();
Datei = SD.open("index.htm");
if(Datei) {
while(Datei.available()) {
client.write(Datei.read());
}
Datei.close();
}
}
Serial.print(HTTP_req);
req_index = 0;
StrClear(HTTP_req, REQ_BUF_SZ);
break;
}
if(c == '\n') {
currentLineIsBlank = true;
}
else if(c != '\r') {
currentLineIsBlank = false;
}
}
}
delay(1);
client.stop();
}
}
void XML_response(EthernetClient cl){
cl.print("<?xml version = \"1.0\" ?>");
cl.print("<inputs>");
cl.print("<analog>");
cl.print(temperatur);
cl.print("</analog>");
cl.print("<analog>");
cl.print(feuchtigkeit);
cl.print("</analog>");
cl.print("<analog>");
cl.print(windgeschwindigkeit);
cl.print("</analog>");
cl.print("<analog>");
cl.print(windrichtung);
cl.print("</analog>");
cl.print("</inputs>");
}
void StrClear(char *str, char length){
for(int i = 0; i < length; i++) {
str[i] = 0;
}
}
char StrContains(char *str, char *sfind){
char found = 0;
char index = 0;
char len;
len = strlen(str);
if(strlen(sfind) > len) {
return 0;
}
while(index < len) {
if(str[index] == sfind[found]) {
found++;
if(strlen(sfind) == found) {
return 1;
}
}
else {
found = 0;
}
index++;
}
return 0;
}
//Temperatur messen
void messen_Temperatur(){
temperatur = (analogRead(A3)*(70.0/1023.0))-20.0;
}
//Luftfeuchtigkeit messen
void messen_Feuchtigkeit(){
feuchtigkeit = dht.readHumidity();
if (isnan(feuchtigkeit)){
feuchtigkeit = 0;
}
}
void Anemometer(){
wind_ct ++;
}
//Windgeschwindigkeit messen
void messen_Geschwindigkeit(){
wind_ct=0;
time = millis();
attachInterrupt(1, Anemometer, RISING);
delay(1000*m_time);
detachInterrupt(1);
windgeschwindigkeit = (float)wind_ct / (float)m_time*2.4;
}
//Windrichtung messen
void messen_Windrichtung(){
cny1 = digitalRead(0);
cny2 = digitalRead(1);
cny3 = digitalRead(2);
if(cny1 == LOW && cny2 == LOW && cny3 == LOW){
windrichtung = "Norden";
wr = "N";
}
else if(cny1 == HIGH && cny2 == LOW && cny3 == LOW){
windrichtung = "Nord-Osten";
wr = "NO";
}
else if(cny1 == LOW && cny2 == HIGH && cny3 == LOW){
windrichtung = "Osten";
wr = "O";
}
else if(cny1 == HIGH && cny2 == HIGH && cny3 == LOW){
windrichtung = "Süd-Osten";
wr = "SO";
}
else if(cny1 == LOW && cny2 == LOW && cny3 == HIGH){
windrichtung = "Süden";
wr = "S";
}
else if(cny1 == HIGH && cny2 == LOW && cny3 == HIGH){
windrichtung = "Süd-Westen";
wr = "SW";
}
else if(cny1 == LOW && cny2 == HIGH && cny3 == HIGH){
windrichtung = "Westen";
wr = "W";
}
else {
windrichtung = "Nord-Westen";
wr = "NW";
}
}
//Werte auf LCD-Display ausgeben
void Display_Ausgabe(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(temperatur);
lcd.print(" C");
lcd.setCursor(0,1);
lcd.print(feuchtigkeit);
lcd.print(" %");
delay(5000);
lcd.clear();
lcd.setCursor(0,0);
if(windgeschwindigkeit <10){
lcd.print("0");
}
lcd.print(windgeschwindigkeit);
lcd.print(" km/h");
// lcd.setCursor(0,1);
// lcd.print(wr);
}