#include /* F() macro and FLASH_STRINGs */ #include #include #include #include #include #include const int dacUpdownPin = 7; const int SDchipSelect = 4; const int UDacPin = 0; const int SchalterPin = 3; Dac dac(dacUpdownPin, UDacPin); /* TODO: - decrease buffer in main loop */ byte mac[] = { 0x90, 0xA1, 0xDA, 0x0F, 0x12, 0x41 }; IPAddress ip(192,168,2,10); #define PREFIX "" WebServer webserver(PREFIX, 80); FLASH_STRING(Page_start, "Lüftung MauszHillier"); FLASH_STRING(Page_end, "
Startseite"); IPAddress co2sens_addr(192,168,2,11); EthernetClient co2sensor; byte co2sens_state; // using an enum seems to produce larger sketches.. #define READ_VAL 1 #define READ_INFO 3 char schalter='?', modus='1'; File dataFile; int freeRam () { extern int __heap_start, *__brkval; int v; return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); } void datalog(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete) { if (dataFile) dataFile.close(); server.httpSuccess("text/plain"); dataFile = SD.open("LOG.TXT"); if (dataFile) { while (dataFile.available()) { server.write(dataFile.read()); } dataFile.close(); } dataFile = SD.open("LOG.TXT", FILE_WRITE); } void rmlog(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete) { if (dataFile) dataFile.close(); server.httpSuccess(); server << Page_start; server << F("Result of log delete: ") << SD.remove("LOG.TXT"); server << Page_end; dataFile = SD.open("LOG.TXT", FILE_WRITE); } void setLueftung(int newVal, char *reason) { if (dataFile) dataFile << millis()/1000 << F(": SET to ") << newVal << F(" by ") << reason << F(" (Ram=") << freeRam() << F(")\n"); dac.write(newVal); } #define NAMELEN 4 #define VALUELEN 5 void startPage(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete) { URLPARAM_RESULT rc; char name[NAMELEN]; char value[VALUELEN]; int newVal; /* sends standard "we're all OK" headers back to the browser */ server.httpSuccess(); server << Page_start; server << F("Lueftung: ") << dac.read(); while (strlen(url_tail)) { rc = server.nextURLparam(&url_tail, name, NAMELEN, value, VALUELEN); if (rc != URLPARAM_EOS) { if (strncmp(name,"dac",4)==0) { newVal=atoi(value); server << F(", gefordert: ") << newVal; setLueftung(newVal, "WWW"); modus='W'; } if (strncmp(name,"aut",4)==0) { modus='A'; } } } server << F("
Stufe: ") << modus << F(" (1-4/Auto/Web) (Schalter: ") << schalter; server << F(")

Setze: 2,3 V - 5,6 V - " "7 V - AUTO" "

Log --- Delete Log"); server << Page_end; } char readSchalter() { int rawVal=analogRead(SchalterPin); if (rawVal>286 && rawVal<347) return 'A'; if (rawVal>704 && rawVal<764) return '2'; if (rawVal>821 && rawVal<882) return '3'; if (rawVal>993) return '4'; return '?'; } void setup() { Serial.begin(9600); Ethernet.begin(mac, ip); webserver.setDefaultCommand(&startPage); webserver.addCommand("set", &startPage); webserver.addCommand("log.txt", &datalog); webserver.addCommand("rmlog", &rmlog); if (!SD.begin(SDchipSelect)) { Serial.println(F("SD init failed")); } else { dataFile = SD.open("LOG.TXT", FILE_WRITE); } setLueftung(230, "INI"); schalter=readSchalter(); } void loop() { char buff[23]; int len = 23; static int counter=0; static int readVal=0; char curSchalter; delay(100); counter++; webserver.processConnection(buff, &len); while (co2sensor.available()) { char c=co2sensor.read(); switch (co2sens_state) { case READ_VAL: if (c>='0' && c<='9') readVal=readVal*10+c-'0'; else { if (readVal) setLueftung(readVal,"AUT"); co2sens_state=READ_INFO; } break; case READ_INFO: dataFile.print(c); break; } } if (!co2sensor.connected()) { co2sensor.stop(); } curSchalter=readSchalter(); if (curSchalter!='?' && curSchalter!=schalter) { schalter=curSchalter; modus=curSchalter; /* using a normal array would consume precious RAM, FLASH_ARRAY means 200 bytes of code increase, so use longish code sequence instead... */ if (curSchalter=='2') setLueftung(560,"MAN"); else if (curSchalter=='3') setLueftung(700,"MAN"); else if (curSchalter=='4') setLueftung(1023,"MAN"); } /* every minute: connect CO2 sensor, log current value*/ if ( counter % 600 == 0) { if (dataFile) { dataFile << millis()/1000 << F(": Val=") << dac.read() << F(". Connecting Sensor...\n"); if (co2sensor.connect(co2sens_addr,23)){ co2sensor.write(modus); co2sens_state=READ_VAL; readVal=0; } } } /* every 5 sec: stabilize DAC output */ if ( counter % 50 == 0) dac.refresh(); }