#include <Wire.h>
#include "DHTesp.h"
#include "NMEA.h"
#include "WiFi.h"
#define alto 64
#define ancho 128
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// Defining the WiFi channel speeds up the connection:
#define WIFI_CHANNEL 6
int sensorPin = 34;
const int DHT_PIN = 32;
DHTesp dhtSensor;
union {
char bytes[4];
float valor;
} velocidadeGPS;
float latitude;
float longitude;
NMEA gps(GPRMC);
void setup() {
Serial.begin(115200);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD, WIFI_CHANNEL);
Serial.print("Connecting to WiFi ");
Serial.print(WIFI_SSID);
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
// DHT22 setup
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
// GPS setup
Serial.begin(9600); // Serial1 is connected to the custom chip
Serial.println("Data received from GPS Fake:");
}
void loop() {
// GPS
while (Serial.available()) {
char serialData = Serial.read();
Serial.print(serialData);
if (gps.decode(serialData)) {
if (gps.gprmc_status() == 'A') {
velocidadeGPS.valor = gps.gprmc_speed(KMPH);
} else {
velocidadeGPS.valor = 0;
}
latitude = gps.gprmc_latitude();
longitude = gps.gprmc_longitude();
Serial.println();
Serial.println();
Serial.print(" Latitude: ");
Serial.println(latitude, 8);
Serial.print("Longitude: ");
Serial.println(longitude, 8);
Serial.print(" Speed: ");
Serial.print(velocidadeGPS.valor);
Serial.println(" Km/h");
convertCoordinatesToCartesian(latitude, longitude);
}
}
// MQ135 gas sensor
int lecturaMQ135 = analogRead(sensorPin);
delay(500);
float ppm = 1200.0 / 1023.0;
float co = ppm * lecturaMQ135;
Serial.print(" ");
Serial.print("Measure the amount of CO gas: ");
Serial.print(co);
Serial.println(" ppm");
delay(1000);
if (co <= 350) {
Serial.println("High air quality");
} else if (350 < co && co <= 800) {
Serial.println("Air quality is moderate");
} else if (800 < co && co <= 1200) {
Serial.println("Low air quality");
} else {
Serial.println("Poor air quality");
}
// DHT22 sensor
TempAndHumidity data = dhtSensor.getTempAndHumidity();
Serial.println("Temp: " + String(data.temperature, 2) + "°C");
Serial.println("Humidity: " + String(data.humidity, 1) + "%");
delay(2000);
// Light sensor
int lightvalue = analogRead(A0);
lightvalue = map(lightvalue, 1023, 0, 0, 100);
Serial.println("Brightness:");
Serial.print(lightvalue);
Serial.print("%");
delay(2000);
Serial.println("---");
}
void convertCoordinatesToCartesian(float latitude, float longitude) {
float latRadius = latitude * (PI) / 180;
float lonRadius = longitude * (PI) / 180;
int earthRadius = 6371;
float posX = earthRadius * cos(latRadius) * cos(lonRadius);
float posY = earthRadius * cos(latRadius) * sin(lonRadius);
Serial.print(" X: ");
Serial.println(posX);
Serial.print(" Y: ");
Serial.println(posY);
}