/* An IoT Etch-A-Sketch uses 2 rotory encoders to generate x,y data points in a svg poly line. */ #include #include #include File dataFile; byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //10.71.148.177 home //IPAddress ip(10, 71, 148, 177); IPAddress ip(10, 1, 0, 177); EthernetServer server(80); //Function defs void rotors(); void rotorA(EthernetClient client); void rotorB(EthernetClient client); void listenClient(EthernetClient client); void pageWrite(EthernetClient client); void polyLineBegin(EthernetClient client); void startPage(EthernetClient client); void endPage(EthernetClient client); int potX = A0; int potY = A1; int sensorValX = 0; int sensorValY = 0; int oldX = 0; int oldY = 0; /**Rotor Vars**/ // Rotary Encoder Input defintions #define CLKA 2 #define DTA 3 #define SWA 4 #define CLKB 5 #define DTB 6 #define SWB 7 int Acounter = 0; int Bcounter = 0; int AcurrentStateCLK; int BcurrentStateCLK; int AlastStateCLK; int BlastStateCLK; String AcurrentDir =""; //just easier than cleverly combining this string for seprate IO String BcurrentDir =""; void setup() { delay(10000); //you want this delay. reason: tl;dr /** Set encoder pins as inputs **/ pinMode(CLKA,INPUT); pinMode(DTA,INPUT); pinMode(SWA, INPUT_PULLUP); pinMode(CLKB,INPUT); pinMode(DTB,INPUT); pinMode(SWB, INPUT_PULLUP); // Read the initial state of CLK AlastStateCLK = digitalRead(CLKA); BlastStateCLK = digitalRead(CLKB); /***End Rotary Encoder vars****/ Serial.begin(9600); Ethernet.begin(mac, ip); if (Ethernet.linkStatus() == LinkOFF) { Serial.println("Ethernet cable is not connected."); } // start the server server.begin(); delay(100); Serial.print("server is at "); Serial.println(Ethernet.localIP()); Serial.print("Initializing SD card..."); if (!SD.begin(BUILTIN_SDCARD)) { Serial.println("SD Card init failed!"); while (1); } /****SD CARD and Ethernet intialized*****/ //if data file (on SD Card) Doesn't exist, create it. //if data file (on SD Card) does exist errase it and create a new one if (SD.exists("datalog.txt")) { Serial.println("datalog.txt exists: \n Removing it."); while(SD.remove("datalog.txt")!=1){ Serial.println("Deleeting old file data"); if (SD.remove("datalog.txt")==1){ Serial.println ("old dataFile removed"); } } } else { Serial.println("datalog.txt doesn't exist."); } // open a new file and immediately close it: Serial.println("Creating datalog.txt..."); dataFile = SD.open("datalog.txt", FILE_WRITE); dataFile.close(); // Check to see if the file exists: if (SD.exists("datalog.txt")) { Serial.println("datalog.txt exists."); } else { Serial.println("datalog.txt wasn't created."); } } //end setup void loop() { // listen for incoming clients EthernetClient client = server.available(); rotors(); listenClient(client); } //end loop void listenClient(EthernetClient client){ if (client) { boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); // Serial.write(c); //tells about the client connection if (c == '\n' && currentLineIsBlank) { pageWrite(client); 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; } }//end avail } //end conect // give the web browser time to receive the data delay(1); // close the connection: client.stop(); } //end client }//end listener() void pageWrite(EthernetClient client){ startPage(client); polyLineBegin(client); endPage(client); } void startPage(EthernetClient client){ // doctype svg no need for html client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); // the connection will be closed after completion of the response client.println("Refresh: 1"); // refresh the page automatically every 5 sec client.println(); client.println(""); client.println(""); client.println("\n"); } void polyLineBegin(EthernetClient client){ //read data points from SD card File dataFile = SD.open("datalog.txt"); // if the file is available, read it: if (dataFile) { while (dataFile.available()) { //Serial.write(dataFile.read()); client.write(dataFile.read()); } dataFile.close(); } } int rotorA(){ //X coords AcurrentStateCLK = digitalRead(CLKA); if (AcurrentStateCLK != AlastStateCLK && AcurrentStateCLK == 1){ if (digitalRead(DTA) != AcurrentStateCLK) { Acounter --; }else{ Acounter ++; } } // Remember last CLK state AlastStateCLK = AcurrentStateCLK; //X limits if(Acounter<=15){ Acounter=15; } if(Acounter>=215){ Acounter=215; } return Acounter; }//endA rotor int rotorB(){ //Y coords BcurrentStateCLK = digitalRead(CLKB); if (BcurrentStateCLK != BlastStateCLK && BcurrentStateCLK == 1){ if (digitalRead(DTB) != BcurrentStateCLK) { Bcounter --; }else{ Bcounter ++; } //Serial.println(Bcounter); } BlastStateCLK = BcurrentStateCLK; //Y limits if(Bcounter<=15){ Bcounter=15; } if(Bcounter>=210){ Bcounter=210; } return Bcounter; }//EndB rotor void rotors(){ //read rotors and write x,y points to datalog.txt sensorValX=rotorA(); sensorValY=rotorB(); String dataString = ""; if(sensorValX!=oldX || sensorValY!=oldY){ dataString += ","; dataString += String(sensorValX); dataString += ", "; dataString += String(sensorValY); Serial.println(dataString); dataFile = SD.open("datalog.txt", FILE_WRITE); // if the file is available, write to it: if (dataFile) { dataFile.print(dataString); dataFile.close(); //clear dataString dataString=""; }else{ // if the file isn't open, pop up an error: Serial.println("error opening datalog.txt"); } dataFile.close(); }else{ ; } oldX=sensorValX; oldY=sensorValY; }//end rotors