Humidity Logger Version 0.1
Now merging SHT11, DS107 and HTTP POST.
Some problems occurred:
pin 10+11 are reserved for Ethernet -- SHT11 has to use pin 8+9
there is no float to String
After fixing the issues and some code cleanup the final version:
#include <SPI.h> #include <Ethernet.h> #include <SHT1x.h> #include "Wire.h" //////////////////////////////////////////////////////////////////////////////// // Specify data and clock connections and instantiate SHT1x object #define dataPin 8 #define clockPin 9 SHT1x sht1x(dataPin, clockPin); //////////////////////////////////////////////////////////////////////////////// // Ethernet data byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xDD }; byte ip[] = { 192,168,1, 42 }; byte gateway[] = { 192, 168, 1, 1}; byte subnet[] = { 255, 255, 255, 0 }; byte server[] = { 192, 168, 1, 2 }; // initialize the library instance: Client client(server, 80); const int postingInterval = 29000; // delay between updates long lastConnectionTime = 0; // last time connected to the server boolean lastConnected = false; // state of the connection long counter = 1; String txtMsg=""; void sendData() { Serial.println("..."); if (client.connect()) { Serial.println("connecting..."); client.print("POST /input/ HTTP/1.1\n"); client.print("Host: HOSTNAME\n"); client.print("X-ApiKey: RANDOM_API_KEY\n"); client.println("User-Agent: Arduino"); client.println("Accept: text/html"); client.print("Content-Length: "); client.println(txtMsg.length(), DEC); client.print("Content-Type: text/json\n"); client.println("Connection: close\n"); client.println(txtMsg); lastConnectionTime = millis(); counter += 1; Serial.println("sent..."); } else { Serial.println("connection failed"); delay(1000); } } //////////////////////////////////////////////////////////////////////////////// // DS1307 #define DS1307_I2C_ADDRESS 0x68 // Convert normal decimal numbers to binary coded decimal byte decToBcd(byte val) { return ( (val/10*16) + (val%10) ); } // Convert binary coded decimal to normal decimal numbers byte bcdToDec(byte val) { return ( (val/16*10) + (val%16) ); } // 1) Sets the date and time on the ds1307 // 2) Starts the clock // 3) Sets hour mode to 24 hour clock // Assumes you're passing in valid numbers void setDateDs1307(byte second, // 0-59 byte minute, // 0-59 byte hour, // 1-23 byte dayOfWeek, // 1-7 byte dayOfMonth, // 1-28/29/30/31 byte month, // 1-12 byte year) // 0-99 { Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.send(0); Wire.send(decToBcd(second)); // 0 to bit 7 starts the clock Wire.send(decToBcd(minute)); Wire.send(decToBcd(hour)); // If you want 12 hour am/pm you need to set // bit 6 (also need to change readDateDs1307) Wire.send(decToBcd(dayOfWeek)); Wire.send(decToBcd(dayOfMonth)); Wire.send(decToBcd(month)); Wire.send(decToBcd(year)); Wire.endTransmission(); } // Gets the date and time from the ds1307 void getDateDs1307(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) { // Reset the register pointer Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.send(0); Wire.endTransmission(); Wire.requestFrom(DS1307_I2C_ADDRESS, 7); // A few of these need masks because certain bits are control bits *second = bcdToDec(Wire.receive() & 0x7f); *minute = bcdToDec(Wire.receive()); *hour = bcdToDec(Wire.receive() & 0x3f); // Need to change this if 12 hour am/pm *dayOfWeek = bcdToDec(Wire.receive()); *dayOfMonth = bcdToDec(Wire.receive()); *month = bcdToDec(Wire.receive()); *year = bcdToDec(Wire.receive()); } void setDT() { byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // Change these values to what you want to set your clock to. // You probably only want to set your clock once and then remove // the setDateDs1307 call. second = 0; minute = 01; hour = 15; dayOfWeek = 0; dayOfMonth = 6; month = 11; year = 11; setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); } //////////////////////////////////////////////////////////////////////////////// String Float2String(float value) { // Convert a float to String with two decimals. String s; s = int(value); s += '.'; s += int((value - int(value)) * 100); return s; } void setup() { // start the Ethernet connection: Ethernet.begin(mac, ip); Wire.begin(); Serial.begin(9600); // if datetime should be set: //setDT() // delay for the ethernet to get up delay(1000); } void loop() { float temp_c, humidity; byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; if(millis() - lastConnectionTime > postingInterval) { // disconnect old client Serial.println(); Serial.println("disconnecting."); client.stop(); delay(1000); // Read values from the sensor temp_c = sht1x.readTemperatureC(); humidity = sht1x.readHumidity(); Serial.print("Temperature: "); Serial.print(temp_c, DEC); Serial.print("C / "); Serial.print("Humidity: "); Serial.print(humidity); Serial.println("%"); // Read data from the clock getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // the JSON message txtMsg = "{ \"temperature\":"; txtMsg += Float2String(temp_c); txtMsg += ", \"humidity\":"; txtMsg += Float2String(humidity); txtMsg += ", \"counter\":"; txtMsg += counter; txtMsg += ", \"datetime\":\'"; txtMsg += int(year); txtMsg += "-"; txtMsg += int(month); txtMsg += "-"; txtMsg += int(dayOfMonth); txtMsg += " "; txtMsg += int(hour); txtMsg += ":"; txtMsg += int(minute); txtMsg += ":"; txtMsg += int(second); txtMsg += "\'"; txtMsg += "}"; // print for debugging Serial.println(txtMsg); sendData(); } lastConnected = client.connected(); }