ESP8266

Good evening guys, so recently i'm doing my final year project regarding IOT stuff. I'm using ESP8266 WiFi module connecting with Arduino Mega 2560 and ThingSpeak platform to record the data. I had done with my coding but my ESP8266 Wifi Module unable to connect with Wifi. I had attached my coding below. The RX pin of wifi module is connected to TX1 which will be pin 18 of arduino and TX pin of wifi module is connected to RX1 pin 19 of arduino. I had removed my wifi id and password for some reason. If anyone know how to fix this stuff please help me. Thanks a lot guys :slight_smile:

#include <SoftwareSerial.h>

String apiKey = "write key";

Serial (18,19); // RX, TX

int LM393 = 2; // Sound sensor pin
int MQ9 = A0; //Sensor pin
float m = -0.481; //Slope
float b = 1.54; //Y-Intercept
float R0 = 3.01; //Sensor Resistance in fresh air from previous code

void setup(){
ser.begin(115200);
Serial.begin(115200);
pinMode(MQ9,INPUT);
pinMode(LM393,INPUT);
unsigned char check_connection=0;
unsigned char times_check=0;
Serial.println("Connecting to Wifi");
while(check_connection==0)
{
Serial.print("..");
ser.print("AT+CWJAP="ssid","pass"\r\n");
ser.setTimeout(5000);
if(ser.find("WIFI CONNECTED\r\n")==1 )
{
Serial.println("WIFI CONNECTED");
break;
}
times_check++;
if(times_check>3)
{
times_check=0;
Serial.println("Trying to Reconnect..");
}
}
delay(5000);

}
void loop()
{
float sensor_volt; //Define variable for sensor voltage
float RS_gas; //Define variable for sensor resistance
float ratio; //Define variable for ratio
int sensorValue = analogRead(MQ9),digitalRead(2); //Read analog values of sensor
sensor_volt = sensorValue*(5.0/1023.0); //Convert analog values to voltage
RS_gas = ((5.0*10.0)/sensor_volt)-10.0; //Get value of RS in a gas
ratio = RS_gas/R0; // Get ratio RS_gas/RS_air
double ppm_log = (log10(ratio)-b)/m; //Get ppm value in linear scale according to the the ratio value
double ppm = pow(10, ppm_log); //Convert ppm value to log scale
Serial.print("Our desired PPM = ");
Serial.println(ppm);
double db = 20.0 * log(10) * (sensorValue +1.);
Serial.print("Our desired db = ");
Serial.println(db);

// TCP connection
String cmd = "AT+CIPSTART="TCP","";
cmd += "184.106.153.149"; // api.thingspeak.com
cmd += "",80";
ser.println(cmd);
if(ser.find("Error")){
Serial.println("AT+CIPSTART error");
return;
}
// prepare GET string
String getStr = "GET /update?api_key=";
getStr += apiKey;
getStr +="&field1=";
getStr += ppm;
getStr +="&field2=";
getStr += db;
getStr += "\r\n\r\n";

// send data length
cmd = "AT+CIPSEND=";
cmd += String(getStr.length());
ser.println(cmd);

if(ser.find(">")){
ser.print(getStr);
Serial.println(getStr);
}
else{
ser.println("AT+CIPCLOSE");
Serial.println("CIPCLOSE");
}

// thingspeak needs 15 sec delay between updates
delay(16000);
}

Some ESP8266 comes default in AP mode.

Configure it to STA mode before calling AT+CWJAP

"AT+CWMODE_CUR=1\r\n"

What does STA stands for ?

STA - station mode (WiFi client)

AP - access point mode (default)

if you are using an ESP8266 this ESP8266 can eliminate the whole Arduino Mega

if you are using a Wemos D1 mini Board you have 8 digital IO-pins available
If you use a nodeMCU-board you have 13 io-pins available

The code below is part of the code you flash into the ESP8266 so the ESP8266 does everything:
reading your sensors, control output etc. etc. and do all the wireless datatransfer to thingspeak
This means the Adruino Mega is completely eliminated

There is a library ThingSpeak.h

connecting to thingspeak is as easy as this

  WiFi.mode(WIFI_STA); 
  Serial.println("WiFi.mode(WIFI_STA); done");
  ThingSpeak.begin(client);  // Initialize ThingSpeak

with this library the code to communicate with thingsspeak shrinks down to this

    ThingSpeak.setField(1, MyValue1);
    ThingSpeak.setField(2, MyValue2);    

    // write to the ThingSpeak channel
    int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
    if(x == 200){
      Serial.println("Channel update successful.");
    }
    else {
      Serial.println("Problem updating channel. HTTP error code " + String(x));
    }

here is a sketch that uses a SHT31 humidity and temperature sensor and sends the data to things-speak

#include "ThingSpeak.h"
#include <ESP8266WiFi.h>

//#define SECRET_SSID "WLANFEZI"           
#define SECRET_SSID "your SendToThingsSpeak_Interval"           
#define SECRET_PASS "your password"     

#define SECRET_CH_ID //your thingspeak channel ID           
#define SECRET_WRITE_APIKEY "your APIwritekey" 

char ssid[] = SECRET_SSID;   // your network SSID (name) 
char pass[] = SECRET_PASS;   // your network password
int keyIndex = 0;            // your network key Index number (needed only for WEP)
WiFiClient  client;

unsigned long myChannelNumber = SECRET_CH_ID;
const char * myWriteAPIKey    = SECRET_WRITE_APIKEY;

#define ESP8266

#include "Wire.h"
#include "SHT31.h"

SHT31 sht;

float SHT31_Temp = -9.87;
float SHT31_Hum  = -12.34;

#include <PString.h>
char    My_ThingSpeak_Status_AoC[128];
PString My_ThingSpeak_Status_PS(My_ThingSpeak_Status_AoC, sizeof(My_ThingSpeak_Status_AoC) );


boolean TimePeriodIsOver (unsigned long &expireTime, unsigned long TimePeriod) {
  unsigned long currentMillis  = millis();
  if ( currentMillis - expireTime >= TimePeriod )
  {
    expireTime = currentMillis; // set new expireTime
    return true;                // more time than TimePeriod) has elapsed since last time if-condition was true
  } 
  else return false;            // not expired
}

      unsigned long LED_BlinkTimer = 0;
const unsigned long MyIntervalInMilliSeconds = 1000;

      unsigned long SHT31_Read_Timer = 0;
const unsigned long SHT31_Read_Interval = 2000;

      unsigned long SendToThingsSpeak_Timer = 0;
const unsigned long SendToThingsSpeak_Interval = 20000;


void PrintFileNameDateTime()
{
  Serial.print("Code running comes from file ");
  Serial.println(__FILE__);
  Serial.print("compiled ");
  Serial.print(__DATE__);
  Serial.println(__TIME__);  
}

void PrintWiFiMacAdress() {
  char MacAdr_AoC[18];  //suffix _AoC for easier remembering variable-type is ArrayOfChar
  char HexByteDigits[3];
  
  for (uint8_t i = 0; i < 18; i = i + 1)
  { 
    MacAdr_AoC[i] = WiFi.macAddress()[i];
  } 
  MacAdr_AoC[17] = 0; // zero to terminate the string
  Serial.print("ESP Board Wifi.macAddress:  ");
  Serial.println(MacAdr_AoC);
  
  Serial.println();
  Serial.println("copy the line below"); 
  Serial.println();
  Serial.print("uint8_t MAC_adrOfRecv[] = { ");
  for (uint8_t i = 0; i < 16; i = i + 3)
  { 
    HexByteDigits[0] = MacAdr_AoC[i];
    HexByteDigits[1] = MacAdr_AoC[i+1];
    HexByteDigits[2] = 0; // zero for terminating the string
    Serial.print("0x");
    Serial.print(HexByteDigits);
    if (i < 14) Serial.print(", ");
  }  
  Serial.println(" };");
  Serial.println();      
}


const int LED_PIN = 2;

void BlinkHeartBeatLED(const int LED_PIN) {
  if (TimePeriodIsOver (LED_BlinkTimer, 500) ) {
    digitalWrite(LED_PIN, !digitalRead(LED_PIN) );
  }
}

void Set_up_SHT31() {
  Serial.print("SHT31_LIB_VERSION: \t");
  Serial.println(SHT31_LIB_VERSION);

  Wire.begin();
  sht.begin(0x44);
  Wire.setClock(10000);

  uint16_t stat = sht.readStatus();
  Serial.print("SHT31 Status ");
  Serial.print(stat, HEX);
  Serial.println();
}

void SHT31_GetTempHum() {
  sht.read(true);         // default = true/fast       slow = false

  SHT31_Temp = sht.getTemperature();
  SHT31_Hum  = sht.getHumidity();

  Serial.print("Temperature: ");
  Serial.print(SHT31_Temp);
  Serial.print("\t");
  Serial.print("Humidity: ");
  Serial.println(SHT31_Hum);
}


void setup() {
  Serial.begin(115200);  // Initialize serial
  Serial.println();
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);  
  
  WiFi.mode(WIFI_STA); 
  Serial.println("WiFi.mode(WIFI_STA); done");
  ThingSpeak.begin(client);  // Initialize ThingSpeak
  Serial.println("ThingSpeak.begin(client); done");

  Set_up_SHT31();
  Serial.println("Set_up_SHT31(); done");
}

void loop() {
  BlinkHeartBeatLED(LED_PIN);
  
  // Connect or reconnect to WiFi
  if(WiFi.status() != WL_CONNECTED){
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(SECRET_SSID);

    WiFi.begin(ssid, pass);

    while ( WiFi.status() != WL_CONNECTED ) 
    {
      delay ( 500 );
      Serial.print ( "." );
    }    
    Serial.println("\nConnected.");
  }

  if (TimePeriodIsOver (SHT31_Read_Timer, SHT31_Read_Interval) ) {
    SHT31_GetTempHum();
  }

  if (TimePeriodIsOver (SendToThingsSpeak_Timer, SendToThingsSpeak_Interval) ) {

    // set the fields with the values
    ThingSpeak.setField(1, SHT31_Temp);
    ThingSpeak.setField(2, SHT31_Hum);
    ThingSpeak.setField(3, 3);
    ThingSpeak.setField(4, 4);
  
    My_ThingSpeak_Status_PS.print("My Status is fine");
    String StatusStr = "My Status is fine";
    ThingSpeak.setStatus(StatusStr);
    
    // write to the ThingSpeak channel
    int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
    if(x == 200){
      Serial.println("Channel update successful.");
    }
    else {
      Serial.println("Problem updating channel. HTTP error code " + String(x));
    }
    
  }

}

best regards Stefan