/* * This sketch uses the microSD card slot on the Arduino Ethernet shield * to serve up files over a very minimal browsing interface * * Some code is from Bill Greiman's SdFatLib examples, some is from the * Arduino Ethernet WebServer example and the rest is from Limor Fried * (Adafruit) so its probably under GPL * * Tutorial is at http://www.ladyada.net/learn/arduino/ethfiles.html * Pull requests should go to http://github.com/adafruit/SDWebBrowse */ #include #include #include #include /************ ETHERNET STUFF ************/ byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; byte ip[] = { 192, 168, 1, 8 }; EthernetServer server(80); /************ SDCARD STUFF ************/ Sd2Card card; SdVolume volume; SdFile root; SdFile file; //SdFat sd; // TMP102 #include int TMP102Address = 0x48; // RTC #include "RTClib.h" RTC_DS1307 RTC; // haven't figured out how to use the RTC as intervalometer long previousMillis; long interval = 15000; // store error strings in flash to save RAM #define error(s) error_P(PSTR(s)) //// //// error print? //// //// void error_P(const char* str) { PgmPrint("error: "); SerialPrintln_P(str); if (card.errorCode()) { PgmPrint("SD error: "); Serial.print(card.errorCode(), HEX); Serial.print(','); Serial.println(card.errorData(), HEX); } while(1); } //// //// SETUP //// //// void setup() { Serial.begin(9600); Serial.println(); //Serial.println(); PgmPrint("20121020 0000"); Serial.println(); Wire.begin(); RTC.begin(); PgmPrint("Free RAM: "); Serial.println(FreeRam()); // initialize the SD card at SPI_HALF_SPEED to avoid bus errors with // breadboards. use SPI_FULL_SPEED for better performance. pinMode(10, OUTPUT); // set the SS pin as an output (necessary!) digitalWrite(10, HIGH); // but turn off the W5100 chip! // pin 4? if (!card.init(SPI_FULL_SPEED, 4)) error("card.init failed!"); // initialize a FAT volume if (!volume.init(&card)) error("vol.init failed!"); PgmPrint("Volume is FAT"); Serial.println(volume.fatType(),DEC); Serial.println(); if (!root.openRoot(&volume)) error("openRoot failed"); // list file in root with date and size PgmPrintln("Files found in root:"); root.ls(LS_DATE | LS_SIZE); Serial.println(); // Recursive list of all directories PgmPrintln("Files found in all dirs:"); root.ls(LS_R); Serial.println(); PgmPrintln("Done"); // Debugging complete, we start the server! Ethernet.begin(mac, ip); server.begin(); } //// //// //// //// void ListFiles(EthernetClient client, uint8_t flags) { // This code is just copied from SdFile.cpp in the SDFat library // and tweaked to print to the client output in html! dir_t p; root.rewind(); //client.println(""); } //// //// TMP102 //// //// float readTMP102_C() { Wire.requestFrom(TMP102Address, 2); byte MSB = Wire.read(); byte LSB = Wire.read(); // don't understand this yet int TemperatureSum = ((MSB << 8) | LSB) >> 4; float TMP102_C = TemperatureSum*0.0625; return TMP102_C; } // How big our line buffer should be. 100 is plenty! // don t fully understand this. 100 bytes? i ve tried making this 200 #define BUFSIZ 100 //// //// LOOP //// //// void loop() { // unsigned long currentMillis = millis(); // IF if (currentMillis - previousMillis > interval) { //replace with RTC previousMillis = currentMillis; // TMP102 float TMP102_C = readTMP102_C(); //////////////////////////////////////////////HIH4030 float HIH4030 = analogRead(0); HIH4030 = (HIH4030/1023)/(1.0546 - 0.00216*TMP102_C); //////////////////////////////////////MOISTURE SENSOR /* digitalWrite(moistureSensorVcc, HIGH); delay(500); moistureValue = analogRead(moistureSensor); digitalWrite(moistureSensorVcc, LOW); moistureValue = map(moistureValue, 0, 1023, 0, 100); */ //debug delete files //char deleteFile[] = "DATA118.CSV"; //if(!file.open(root, deleteFile, O_WRITE)) ("Opening delete file failed"); //if (!file.remove()) error("Deletion of 106 failed"); //Serial.print(deleteFile); //PgmPrintln(" deleted."); //// char name[] = "DATA119.CSV"; //PgmPrint("Appending to: "); //Serial.println(name); if (!file.open(root, name, O_CREAT | O_APPEND | O_WRITE)) error("open failed"); DateTime now = RTC.now(); file.print(now.year(), DEC); file.print(now.month(), DEC); file.print(now.day(), DEC); file.print("_"); if (int(now.hour()) < 10) { file.print("0"); file.print(now.hour(), DEC); } else { file.print(now.hour(), DEC); } file.print(":"); if (int(now.minute()) < 10) { file.print("0"); file.print(now.minute(), DEC); } else { file.print(now.minute(), DEC); } file.print(":"); if (int(now.second()) < 10) { file.print("0"); file.print(now.second(), DEC); } else { file.print(now.second(), DEC); } file.print(", "); file.print(now.unixtime()); //Serial.print(now.unixtime()); file.print(", "); //Serial.print(", "); file.print(TMP102_C); //Serial.println(TMP102_C); file.print(", "); file.print(HIH4030); file.println(""); if (file.writeError) error("write failed"); if (!file.close()) error("close failed"); //Serial.println("Done"); Serial.println(); } //// char clientline[BUFSIZ]; int index = 0; EthernetClient client = server.available(); if (client) { // an http request ends with a blank line boolean current_line_is_blank = true; // reset the input buffer index = 0; while (client.connected()) { if (client.available()) { char c = client.read(); // If it isn't a new line, add the character to the buffer if (c != '\n' && c != '\r') { clientline[index] = c; index++; // are we too big for the buffer? start tossing out data if (index >= BUFSIZ) index = BUFSIZ -1; // continue to read more data! continue; } // got a \n or \r new line, which means the string is done clientline[index] = 0; // Print it out for debugging Serial.print("clientline: "); Serial.println(clientline); // Look for substring such as a request to get the root file if (strstr(clientline, "GET / ") != 0) { // send a standard http response header client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); // print all the files, use a helper to keep it clean //client.println("

Files:

"); ListFiles(client, LS_SIZE); } else if (strstr(clientline, "GET /") != 0) { // this time no space after the /, so a sub-file! char *filename; filename = clientline + 5; // look after the "GET /" (5 chars) // a little trick, look for the " HTTP/1.1" string and // turn the first character of the substring into a 0 to clear it out. (strstr(clientline, " HTTP"))[0] = 0; // print the file we want Serial.println(filename); if (! file.open(&root, filename, O_READ)) { client.println("HTTP/1.1 404 Not Found"); client.println("Content-Type: text/html"); client.println(); client.println("

File Not Found!

"); break; } Serial.println("Opened!"); client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/plain"); client.println(); int16_t c; while ((c = file.read()) > 0) { // uncomment the serial to debug (slow!) //Serial.print((char)c); client.print((char)c); } file.close(); } else { // everything else is a 404 client.println("HTTP/1.1 404 Not Found"); client.println("Content-Type: text/html"); client.println(); client.println("

File Not Found!

"); } break; } } // give the web browser time to receive the data delay(1); client.stop(); } }