We're using the ESP8266 to receive data from the Arduino Mega board, where our sensors are connected. Supposedly, our ESP is connected to the Blynk App. However, the values showing up in our dashboard are 0 but, the app says that the device is online.
The values in the sensors are showing up in our LCD, so we think that the problem is the connection between the ESP and the Arduino.
We've attached our ESP and Arduino Mega code below for anyone's reference.
ESP code:
#define BLYNK_TEMPLATE_ID "ID"
#define BLYNK_TEMPLATE_NAME "CROPBOX"
#define BLYNK_AUTH_TOKEN "TOKEN"
/* Comment this out to disable prints and save space */
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SoftwareSerial.h>
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "WiFi_Name";
char pass[] = "WiFi_PW";
// This function is called every time the device is connected to the Blynk.Cloud
SoftwareSerial swSerial(V5, V6); // RX, TX
void setup()
{
// Debug console
Serial.begin(9600);
Serial.println("ESP8266 standalone test");
swSerial.begin(9600);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
Serial.print("connecting to WiFi");
Serial.print(ssid);
WiFi.begin(ssid, pass);
Serial.println();
Serial.print("Connecting");
while(WiFi.status() != WL_CONNECTED ){
delay(1000);
Serial.println(".");
}
Serial.print("NodeMCU IP Address:");
Serial.print(WiFi.localIP());
pinMode(V5, INPUT);
pinMode(V6, OUTPUT);
}
void loop()
{
Blynk.run();
int i = 30;
swSerial.print(i);
swSerial.println("\n");
delay(30);
// You can inject your own code or combine it with other sketches.
// Check other examples on how to communicate with Blynk. Remember
// to avoid delay() function!
}
Arduino code:
/* Fill-in information from Blynk Device Info here */
#define BLYNK_TEMPLATE_ID "ID"
#define BLYNK_TEMPLATE_NAME "CROPBOX"
#define BLYNK_AUTH_TOKEN "TOKEN"
// Libraries
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <HCSR04.h>
#include <SoftwareSerial.h>
#include <SD.h> // Include the SD library for microSD card functionality
#include <BlynkSimpleStream.h>
#include <Blynk.h>
// Pin Connections
#define DHTPIN 2
#define DHTTYPE DHT11
#define ONE_WIRE_BUS 4
#define MQ135_AO A3
#define MQ135_DO 7
#define SD_CHIP_SELECT 53 // Pin 51 in Arduino Mega corresponds to pin 53 for SD_CHIP_SELECT
#define CS_PIN 53 // Chip select pin for SD card
#define SCK_PIN 52 // SCK pin for SD card
#define MOSI_PIN 51 // MOSI pin for SD card
#define MOSO_PIN 50 // MISO pin for SD card
// Initialization
DHT dht(DHTPIN, DHTTYPE);
float calibration_value = 1 + 0.6; // pH
int phval = 0;
unsigned long int avgval;
int buffer_arr[10], temp;
float ph_act;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
namespace pin {
const byte tds_sensor = A1;
}
namespace device {
float aref = 4.3;
}
namespace sensor {
float ec = 0;
unsigned int tds = 0;
float waterTemp = 0;
float ecCalibration = 1;
}
UltraSonicDistanceSensor distanceSensor(12, 11);
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2);
SoftwareSerial s(5, 6);
String str;
File dataFile;
void setup() {
Serial.begin(9600);
//ArduinoMega.begin(4800);
Serial.println("Humidity and Temperature");
dht.begin();
sensors.begin();
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
lcd.begin(16, 2);
lcd.backlight();
s.begin(9600);
// Initialize SD card
if (!SD.begin(SD_CHIP_SELECT)) {
Serial.println("Initialization failed!");
return;
}
Serial.println("Initialization done.");
// Create a file on the SD card if it doesn't exist
if (!SD.exists("data.txt")) {
dataFile = SD.open("data.txt", FILE_WRITE);
if (dataFile) {
dataFile.close();
Serial.println("File created.");
} else {
Serial.println("Error creating file.");
}
}
}
void loop() {
// Read all sensor values
float h = readHumidity();
float t = readAirTemperature();
float ph = readPH();
float waterTemp = readWaterTemperature();
unsigned int tds = readTDS();
float ec = readEC();
float distance = readDistance();
int lightIntensity = readLightIntensity();
int co2Level = readCO2Level();
DateTime now = rtc.now();
Blynk.virtualWrite(V1, ec);
Blynk.virtualWrite(V2, tds);
Blynk.virtualWrite(V3, waterTemp);
Blynk.virtualWrite(V4, ph);
Blynk.virtualWrite(V5, h);
Blynk.virtualWrite(V6, t);
Blynk.virtualWrite(V7, distance);
Blynk.virtualWrite(V8, lightIntensity);
Blynk.virtualWrite(V9, co2Level);
// Serial Output
printToSerial(h, t, ph, waterTemp, tds, ec, distance, lightIntensity, co2Level, now);
// Display Data on LCD
LCDisplay(h, t, ph, waterTemp, tds, ec, distance, lightIntensity, co2Level, now);
// Send to NodeMCU
sendToNodeMCU(h, t, ph, waterTemp, tds, ec, distance, lightIntensity, co2Level);
// Write data to SD card
writeDataToSDCard(h, t, ph, waterTemp, tds, ec, distance, lightIntensity, co2Level, now);
delay(3000);
}
float readHumidity() {
return dht.readHumidity();
}
float readAirTemperature() {
return dht.readTemperature();
}
float readPH() {
for (int i = 0; i < 10; i++) {
buffer_arr[i] = analogRead(A0);
delay(30);
}
for (int i = 0; i < 9; i++) {
for (int j = i + 1; j < 10; j++) {
if (buffer_arr[i] > buffer_arr[j]) {
temp = buffer_arr[i];
buffer_arr[i] = buffer_arr[j];
buffer_arr[j] = temp;
}
}
}
avgval = 0;
for (int i = 2; i < 8; i++)
avgval += buffer_arr[i];
float volt = (float)avgval * 5.0 / 1024 / 6;
return -5.70 * volt + calibration_value;
}
float readWaterTemperature() {
sensors.requestTemperatures();
return sensors.getTempCByIndex(0);
}
unsigned int readTDS() {
sensors.requestTemperatures();
sensor::waterTemp = sensors.getTempCByIndex(0);
float rawEc = analogRead(pin::tds_sensor) * device::aref / 1024.0;
float temperatureCoefficient = 1.0 + 0.02 * (sensor::waterTemp - 25.0);
sensor::ec = (rawEc / temperatureCoefficient) * sensor::ecCalibration;
sensor::tds = (133.42 * pow(sensor::ec, 3) - 255.86 * sensor::ec * sensor::ec + 857.39 * sensor::ec) * 0.5;
return sensor::tds;
}
float readEC() {
return sensor::ec;
}
float readDistance() {
return distanceSensor.measureDistanceCm();
}
int readLightIntensity() {
return analogRead(A2);
}
int readCO2Level() {
return analogRead(MQ135_AO);
}
void LCDisplay(float h, float t, float ph, float waterTemp, unsigned int tds, float ec, float distance, int light, int co2, DateTime now) {
lcd.clear();
lcd.print("AirTemp: " + String(t) + "C");
lcd.setCursor(0, 1);
lcd.print("AirHumid: " + String(h) + "%");
delay(2500);
lcd.clear();
lcd.print("pH: " + String(ph));
lcd.setCursor(0, 1);
lcd.print("WtrTemp: " + String(waterTemp) + "C");
delay(2500);
lcd.clear();
lcd.print("TDS: " + String(tds) + "ppm");
lcd.setCursor(0, 1);
lcd.print("EC: " + String(ec) + " mS/cm");
delay(2500);
lcd.clear();
lcd.print("WtrLvl: " + String(distance) + "cm");
lcd.setCursor(0, 1);
lcd.print("Light: " + String(light) + " units");
delay(2500);
lcd.clear();
lcd.print("CO2: " + String(co2) + " ppm");
delay(2500);
lcd.clear();
lcd.print(String(now.day()) + "/" + String(now.month()) + "/" + String(now.year()));
lcd.setCursor(0, 1);
lcd.print(String(now.hour()) + ":" + String(now.minute()) + ":" + String(now.second()));
delay(2500);
}
void readTdsQuick() {
sensors.requestTemperatures();
sensor::waterTemp = sensors.getTempCByIndex(0);
float rawEc = analogRead(pin::tds_sensor) * device::aref / 1024.0;
float temperatureCoefficient = 1.0 + 0.02 * (sensor::waterTemp - 25.0);
sensor::ec = (rawEc / temperatureCoefficient) * sensor::ecCalibration;
sensor::tds = (133.42 * pow(sensor::ec, 3) - 255.86 * sensor::ec * sensor::ec + 857.39 * sensor::ec) * 0.5;
Serial.print("TDS: ");
Serial.println(sensor::tds);
Serial.print("EC: ");
Serial.println(sensor::ec, 2);
}
void printToSerial(float h, float t, float ph, float waterTemp, unsigned int tds, float ec, float distance, int lightIntensity, int co2Level, DateTime now) {
Serial.print("Air Humidity: ");
Serial.print(h);
Serial.println("% ");
Serial.print("Air Temperature: ");
Serial.print(t);
Serial.println("C ");
Serial.print("pH Val: ");
Serial.println(ph);
Serial.print("Water Temperature: ");
Serial.println(waterTemp);
Serial.print("TDS: ");
Serial.println(tds);
Serial.print("EC: ");
Serial.println(ec, 2);
Serial.print("Ultrasonic Distance: ");
Serial.println(distance);
Serial.print("Light Intensity: ");
Serial.println(lightIntensity);
Serial.print("CO2 Level: ");
Serial.println(co2Level);
Serial.print(now.dayOfTheWeek());
Serial.print(" ");
Serial.print(now.day(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.year(), DEC);
Serial.print(" -- ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.println(now.second(), DEC);
}
void sendToNodeMCU(float h, float t, float ph, float waterTemp, unsigned int tds, float ec, float distance, int lightIntensity, int co2Level) {
s.print(h, 2); s.print("A");
s.print(t, 2); s.print("B");
s.print(ph, 2); s.print("C");
s.print(ec, 2); s.print("D");
s.print(tds, 2); s.print("E");
s.print(distance, 2); s.print("F");
s.print(waterTemp, 2); s.print("G");
s.print(co2Level); s.print("H");
s.print("\n");
delay(500);
}
void writeDataToSDCard(float h, float t, float ph, float waterTemp, unsigned int tds, float ec, float distance, int light, int co2, DateTime now) {
// Open the data file in write mode
dataFile = SD.open("data.txt", FILE_WRITE);
if (dataFile) {
// Write sensor data to the file
dataFile.print(h);
dataFile.print(",");
dataFile.print(t);
// Write other sensor data similarly
dataFile.print(",");
dataFile.print(ph);
dataFile.print(",");
dataFile.print(waterTemp);
dataFile.print(",");
dataFile.print(tds);
dataFile.print(",");
dataFile.print(ec);
dataFile.print(",");
dataFile.print(distance);
dataFile.print(",");
dataFile.print(light);
dataFile.print(",");
dataFile.print(co2);
// Write timestamp
dataFile.print(",");
dataFile.print(now.year(), DEC);
dataFile.print("/");
dataFile.print(now.month(), DEC);
dataFile.print("/");
dataFile.print(now.day(), DEC);
dataFile.print(" ");
dataFile.print(now.hour(), DEC);
dataFile.print(":");
dataFile.print(now.minute(), DEC);
dataFile.print(":");
dataFile.println(now.second(), DEC);
// Close the file
dataFile.close();
} else {
Serial.println("Error opening data file.");
}
}