#include <RedFly.h>
#include <RedFlyServer.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <RTClib.h>
#include <SoftwareSerial.h> //LCD
#include <MemoryFree.h>
#define RELAY 11
SoftwareSerial mySerial(3,8); // pin 8 = TX, pin 3 = RX (unused)
#define ONE_WIRE_BUS 10 // DS18B20 an Pin 10 angeschlossen
// Pass our oneWire reference to Dallas Temperature.
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
RTC_DS1307 RTC;
int buttonPin = 12;
int warte = 0;
long previousMillis = 0; //für millis-delay
int interval = 10000;
byte ip[] = { 192,168,178,111 }; //ip from shield (server)
byte netmask[] = { 255,255,255,0 }; //netmask
//initialize the server library with the port
//you want to use (port 80 is default for HTTP)
RedFlyServer server(80);
//debug output functions (9600 Baud, 8N2)
//Leonardo boards use USB for communication, so we dont need to disable the RedFly
void debugout(char *s)
{
#if defined(__AVR_ATmega32U4__)
Serial.print(s);
#else
RedFly.disable();
Serial.print(s);
RedFly.enable();
#endif
}
void debugoutln(char *s)
{
#if defined(__AVR_ATmega32U4__)
Serial.println(s);
#else
RedFly.disable();
Serial.println(s);
RedFly.enable();
#endif
}
void setup(){
uint8_t ret;
Serial.begin(9600); //init serial port and set baudrate
while(!Serial); //wait for serial port to connect (needed for Leonardo only)
//init the WiFi module on the shield
// ret = RedFly.init(br, pwr) //br=9600|19200|38400|57600|115200|200000|230400, pwr=LOW_POWER|MED_POWER|HIGH_POWER
// ret = RedFly.init(pwr) //9600 baud, pwr=LOW_POWER|MED_POWER|HIGH_POWER
// ret = RedFly.init() //9600 baud, HIGH_POWER
ret = RedFly.init();
if(ret)
{
debugoutln("INIT ERR"); //there are problems with the communication between the Arduino and the RedFly
}
else
{
//scan for wireless networks (must be run before join command)
RedFly.scan();
//join network
ret = RedFly.join(*SSID*, *PW*, INFRASTRUCTURE);
if(ret)
{
debugoutln("JOIN ERR");
for(;;); //do nothing forevermore
}
else
{
//set ip config
ret = RedFly.begin(ip, 0, 0, netmask);
if(ret)
{
debugoutln("BEGIN ERR");
RedFly.disconnect();
for(;;); //do nothing forevermore
}
else
{
RedFly.getlocalip(ip); //receive shield IP in case of DHCP/Auto-IP
server.begin();
}
}
}
pinMode(RELAY, OUTPUT);
digitalWrite(RELAY, HIGH); // turn the relay on (HIGH is the voltage level)
//LCD
mySerial.begin(9600); // set up serial port for 9600 baud
delay(500); // wait for display to boot up
clearLCD();
backlightOn();
//RTC
Wire.begin();
RTC.begin();
//Temperatur
sensors.begin();
delay(1000);
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!"); }
// following line sets the RTC to the date & time this sketch was compiled
// RTC.adjust(DateTime(__DATE__, __TIME__));
}
void loop()
{
long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
sensors.requestTemperatures();
}
int Temp1 = sensors.getTempCByIndex(0);
int Temp2 = sensors.getTempCByIndex(1);
//listen for incoming clients
if(server.available())
{
//a http request ends with a blank line
boolean currentLineIsBlank = true;
while(server.available())
{
char c = server.read();
//if you've gotten to the end of the line (received a newline
//character) and the line is blank, the http request has ended,
//so you can send a reply
if(c == '\n' && currentLineIsBlank)
{
//clear input buffer
server.flush();
//send standard HTTP 200 header
server.print_P(PSTR("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"));
//send some text
server.println_P(PSTR("Willkommen auf Steffens Terrarien-Server!
"));
server.println_P(PSTR("
Temperatur oben: "));
server.print(Temp1, DEC);
server.println_P(PSTR("°C"));
server.println_P(PSTR("
Temperatur unten: "));
server.print(Temp2, DEC);
server.println_P(PSTR("°C"));
server.println_P(PSTR("
"));
//show IP address of RedFly
server.println_P(PSTR("
<i>RedFly IP: "));
server.print(ip[0], DEC); server.print(".");
server.print(ip[1], DEC); server.print(".");
server.print(ip[2], DEC); server.print(".");
server.print(ip[3], DEC);
server.println_P(PSTR("
</i>"));
break;
}
if(c == '\n')
{
//you're starting a new line
currentLineIsBlank = true;
}
else if(c != '\r')
{
//you've gotten a character on the current line
currentLineIsBlank = false;
}
}
//close connection
server.stop();
}
else if(!server.connected()) //listening port still open?
{
server.stop(); //stop and reset server
server.begin(); //start server
}
//starte offline Programm
DateTime now = RTC.now();
// In Line 1 wird das Datum und die Uhrzeit geschrieben
selectLineOne();
if (now.day() < 10) {mySerial.print('0');}
mySerial.print(now.day(), DEC);
mySerial.print(".");
if (now.month() < 10) {mySerial.print('0');}
mySerial.print(now.month(), DEC);
mySerial.print('.');
if (now.year() < 10) {mySerial.print('0');}
mySerial.print(now.year(), DEC);
mySerial.print(" ");
if (now.hour() < 10) {mySerial.print('0');}
mySerial.print(now.hour(), DEC);
mySerial.print(':');
if (now.minute() < 10) {mySerial.print('0');}
mySerial.print(now.minute(), DEC);
mySerial.print(':');
if (now.second() < 10) {mySerial.print('0');}
mySerial.print(now.second(), DEC);
//In Line 2 wird geschrieben
selectLineTwo();
mySerial.print("Temp. Oben: ");
mySerial.print(Temp1); // Warum "byIndex"? Man kann mehr, als nur einen IC auf dem gleichen bus haben. 0 bezieht sich auf den ersten IC.
mySerial.print(char(223)); //°
mySerial.print("C");
//In Line 3 wird geschrieben
selectLineThree();
mySerial.print("Temp. Unten: ");
mySerial.print(Temp2); // Warum "byIndex"? Man kann mehr, als nur einen IC auf dem gleichen bus haben. 1 bezieht sich auf den zweiten IC.
mySerial.print(char(223)); //°
mySerial.print("C");
//In Line 4 wird geschrieben
selectLineFour();
if (digitalRead(buttonPin)==HIGH){
mySerial.print("gef");
mySerial.print(char(245)); //ü
mySerial.print("ttert: ");
if (now.day() < 10) {mySerial.print('0');}
mySerial.print(now.day(), DEC);
mySerial.print(".");
if (now.month() < 10) {mySerial.print('0');}
mySerial.print(now.month(), DEC);
mySerial.print(".");
if (now.year() < 10) {mySerial.print('0');}
mySerial.print(now.year()-2000, DEC);}
// Schaltung des Relais
int Stunde = now.hour();
int relais = 0;
if (Stunde > 9 && Stunde < 21){
relais = 1;}
else {relais = 0;}
if (relais == 1 && Temp1 < 34 && warte == 0){ // Schalte das Relais an, wenn Temp. Oben < 34°C
digitalWrite(RELAY, HIGH);} // und Zeit zwischen 10 Uhr und 20 Uhr
else if(relais == 1){ // Wartet nach 34°C auf Abkühlung bis 30°C
if(Temp1 >= 34) {
digitalWrite(RELAY, LOW);
warte = 1; }
else if (Temp1 <= 29) {warte = 0;}}
else{
digitalWrite(RELAY, LOW);
warte = 1;}
Serial.print("freeMemory()=");
Serial.println(freeMemory());
} //void loop Ende
//SerialLCD Functions
void selectLineOne(){ //puts the cursor at line 0 char 0.
mySerial.write(0xFE); //command flag
mySerial.write(128); //position
}
void selectLineTwo(){ //puts the cursor at line 2 char 0.
mySerial.write(0xFE); //command flag
mySerial.write(192); //position
}
void selectLineThree(){ //puts the cursor at line 3 char 0.
mySerial.write(0xFE); //command flag
mySerial.write(148); //position
}
void selectLineFour(){ //puts the cursor at line 4 char 0.
mySerial.write(0xFE); //command flag
mySerial.write(212); //position
}
void clearLCD(){
mySerial.write(0xFE); //command flag
mySerial.write(0x01); //clear command.
}
void backlightOn(){ //turns on the backlight
mySerial.write(0x7C); //command flag for backlight stuff
mySerial.write(157); //light level.
}
void backlightOff(){ //turns off the backlight
mySerial.write(0x7C); //command flag for backlight stuff
mySerial.write(128); //light level for off.
}
void backlight50(){ //sets the backlight at 50% brightness
mySerial.write(0x7C); //command flag for backlight stuff
mySerial.write(150); //light level for off.
}