/* This is the base code used for the PCB designed in this project. It does not include buttons to update WiFi credentials. */ //Code for master ATMEGA328P-AU #include #include #include #include #include #include //const definitions #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET 4 #define ONE_WIRE_BUS 2 //Global definitions Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); String sDat; OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); void setup() { sensors.begin(); display.begin(SSD1306_SWITCHCAPVCC,0x3C); display.clearDisplay(); display.display(); SPI.begin(); SPI.setClockDivider(SPI_CLOCK_DIV8);//2MHz digitalWrite(SS,HIGH);//Set SlaveSelect HIGH so master doesn't connect to slave } void loop() { sensors.requestTemperatures(); sDat=String(sensors.getTempCByIndex(0)); drawChar(sDat + " degC"); byte mSend, mReceive; digitalWrite(SS,LOW);//Start communication w/ slave mReceive=SPI.transfer(mSend=sensors.getTempCByIndex(0));//Send the mSend val to slave also receives val } void drawChar(String str){ display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.cp437(true); display.print(str); display.display(); } /****************************************************************************************** * Code for slave ATMEGA328P-AU ****************************************************************************************** */ #include volatile bool received; volatile byte sReceived, sSend; static String AP="CroHome";//AP name static String PASS="allourbirthdays";// AP Password static String API="4UXAGXPGI3TFYCIY"; static String HOST="api.thingspeak.com"; static String PORT="80"; int cTrueCommand, cTimeCommand; bool found=false; int sVal=1; void setup() { //ESP8266 setup Serial.begin(115200); sendCommand("AT+RST",5,"OK"); sendCommand("AT",5,"OK"); sendCommand("AT+CWMODE=1",5,"OK"); String cmd=F("AT+CWJAP=\""); cmd+=AP; cmd+=F("\",\""); cmd+=PASS; cmd+=F("\""); sendCommand(cmd,20,"OK"); //SPI setup pinMode(MISO,OUTPUT);//Sets miso as OUTPUT (Have to send data to Master IN) SPCR|=_BV(SPE);//Turn on SPI in slave mode received=false; SPI.attachInterrupt();//Interrupt ON for SPI communication } void loop() { if(received){ byte sByte=sReceived;//Integer data in F ready if(sByte!=185 && sByte!=-196){//avoid temp sensor error values String strSByte=String(sByte); String getDat="GET /update?api_key="+API+"&field1="+strSByte; sendCommand("AT+CIPMUX=1",5,"OK"); sendCommand("AT+CIPSTART=0,\"TCP\",\""+HOST+"\","+PORT,15,"OK"); sendCommand("AT+CIPSEND=0,"+String(getDat.length()+4),4,">"); Serial.println(getDat); cTrueCommand++; sendCommand("AT+CIPCLOSE=0",5,"OK"); } } } ISR(SPI_STC_vect){ sReceived=SPDR; received=true; } void sendCommand(String command, int maxTime, char readReplay[]){//Send data to ESP8266 while(cTimeCommand < (maxTime*1)){ Serial.println(command);//at+cipsend if(Serial.find(readReplay)){ found=true; break; } cTimeCommand++; } if(found){ cTrueCommand++; cTimeCommand=0; } else{ cTrueCommand=0; cTimeCommand=0; } found=false; }