#include <WiFi.h>
#include "DHTesp.h"
#include <Adafruit_MPU6050.h>
#include <DFRobot_Heartrate.h>
#include <ThingsBoard.h>
#include <ArduinoJson.h>
#include <SoftwareSerial.h>
//http client
#include <HTTPClient.h>
// #define TINY_GSM_MODEM_SIM808
// #include <TinyGsmClient.h>
const int DHT_PIN = 13;
const int HeartratePin = 25;
DHTesp dhtSensor;
Adafruit_MPU6050 mpu;
DFRobot_Heartrate heartrate(DIGITAL_MODE);
char WIFI_SSID[] = "Wokwi-GUEST";
char WIFI_PASSWORD[] = "";
unsigned long lastPostDHT = 0;
unsigned long lastPostGPS = 0;
unsigned long lastPostMPU = 0;
unsigned long lastPostHeartRate = 0;
int tryConnecting = 1;
int MAxtryConnecting = 3;
#define TOKEN_HEARTRATE "HeartRateCow213120128bcasmhasd"
#define TOKEN_GPS "GPS0129hjjfsdjhkasdljyec"
#define TOKEN_MPU "MPU60507123ghhdgghhmiasdywqcn"
#define TOKEN_DHT22 "CowTempmererwvntqer2022"
// ThingsBoard server instance.
#define THINGSBOARD_SERVER "thingsboard.cloud"
#define TINY_GSM_MODEM_SIM800
// // GSm Conig
// const char sim_apn[] = "internet";
// const char sim_user[] = "";
// const char sim_pass[] = "";
// // Serial port for GSM shield
// SoftwareSerial serialGsm(19, 18); // RX, TX pins for communicating with modem
// #ifdef DUMP_AT_COMMANDS
// #include <StreamDebugger.h>
// StreamDebugger debugger(serialGsm, Serial);
// TinyGsm modem(debugger);
// #else
// // Initialize GSM modem
// TinyGsm modem();
// #endif
// // Initialize GSM client
// TinyGsmClient client(modem);
// // Initialize ThingsBoard instance
// ThingsBoardHttp tb_http(client, TOKEN_HEARTRATE, THINGSBOARD_SERVER, 80);
// // Set to true, if modem is connected
// bool modemConnected = false;
WiFiClient espClient;
ThingsBoard tb(espClient);
void InternetConnection()
{
Serial.println("Connecting to AP ...");
// attempt to connect to WiFi network
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
// tryConnecting += 1;
}
// if (WiFi.status() != WL_CONNECTED && tryConnecting == MAxtryConnecting) {
// // Set GSM module baud rate
// serialGsm.begin(115200);
// delay(3000);
// // Lower baud rate of the modem.
// // This is highly practical for Uno board, since SoftwareSerial there
// // works too slow to receive a modem data.
// serialGsm.write("AT+IPR=9600\r\n");
// serialGsm.end();
// serialGsm.begin(9600);
// // Restart takes quite some time
// // To skip it, call init() instead of restart()
// Serial.println(F("Initializing modem..."));
// modem.restart();
// String modemInfo = modem.getModemInfo();
// Serial.print(F("Modem: "));
// Serial.println(modemInfo);
// ModemReconnect();
// }
Serial.println("Connected to AP");
}
void InitMPU() {
while (!mpu.begin()) {
Serial.println("MPU6050 not connected!");
delay(1000);
}
Serial.println("MPU6050 ready!");
}
void tb_connect(char token[]){
Serial.print("Connecting to: ");
Serial.print(THINGSBOARD_SERVER);
Serial.print(" with token ");
Serial.println(TOKEN_HEARTRATE);
if (!tb.connect(THINGSBOARD_SERVER, token)) {
Serial.println("Failed to connect");
return;
}
}
void heartRateLogic() {
if (millis() - lastPostHeartRate >= 200) {
lastPostHeartRate = millis();
// Connect to the ThingsBoard
tb_connect(TOKEN_HEARTRATE);
int rateValue;
heartrate.getValue(HeartratePin);
rateValue = heartrate.getRate();
if (rateValue > 0) {
Serial.println(rateValue);
tb.sendTelemetryFloat("heart_rate", rateValue);
}
}
tb.loop();
}
void ModemReconnect() {
// if (!modemConnected) {
// Serial.print(F("Waiting for network..."));
// if (!modem.waitForNetwork()) {
// Serial.println(" fail");
// delay(10000);
// return;
// }
// Serial.println(" OK");
// Serial.print(F("Connecting to "));
// Serial.print(sim_apn);
// if (!modem.gprsConnect(sim_apn, sim_user, sim_pass)) {
// Serial.println(" fail");
// delay(10000);
// return;
// }
// modemConnected = true;
// Serial.println(" OK");
// }
}
void MPU_logic() {
if (millis() - lastPostMPU >= 100) {
// Connect to the ThingsBoard
tb_connect(TOKEN_MPU);
lastPostMPU = millis();
/* Get new sensor events with the readings */
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
String type_event_bite ="";
/*
For bite,
Y–X = positive
Y–Z = positive
2. For chew,
Y–X = negative
Y–Z = negative
Hence when both Y–X, Y–Z are positive/negative
it is concluded as Bite and Chew, respectively.
3. For chew–bite,
Y–X = negative
Y–Z = positive
(Or)
Y–X = positive
Y–Z = negative
*/
float x,y,z =0;
x = a.acceleration.x;
y = a.acceleration.y;
z = a.acceleration.z;
if(y - x > 0 && y-z >0){
type_event_bite ="bite";
}else if(y - x < 0 && y-z < 0){
type_event_bite ="chew";
}else if((y - x < 0 && y-z > 0) || (y - x > 0 && y-z < 0)){
type_event_bite ="chew–bite";
}
Telemetry data_acceleration[] = {
{ "x", x },
{ "y", y },
{ "z", z }
};
tb.sendTelemetryString("chew_bite_event",type_event_bite.c_str());
tb.sendTelemetry(data_acceleration, 3);
/* Print out the values */
Serial.print("Acceleration X: ");
Serial.print(x);
Serial.print(", Y: ");
Serial.print(y);
Serial.print(", Z: ");
Serial.print(z);
Serial.println(" m/s^2");
Serial.println(type_event_bite);
}
tb.loop();
}
void Gps_logic() {
if (millis() - lastPostDHT >= 2000) {
// Connect to the ThingsBoard
tb_connect(TOKEN_GPS);
lastPostDHT = millis();
Telemetry data_gps[2] = {
{ "latitude", -6.231060022684263 },
{ "longitude", 106.60235548940577 },
};
tb.sendTelemetry(data_gps, 2);
}
tb.loop();
}
void DHT_logic() {
if (millis() - lastPostGPS >= 1000) {
lastPostGPS = millis();
// Connect to the ThingsBoard
// tb_connect(TOKEN_DHT22);
TempAndHumidity data = dhtSensor.getTempAndHumidity();
// tb.sendTelemetryInt("temperature", data.temperature);
// tb.sendTelemetryFloat("humidity", data.humidity);
DynamicJsonDocument doc(200);
String JsonDataString;
doc["temperature"] = data.temperature;
doc["humidity"] = data.humidity;
serializeJson(doc, JsonDataString);
SendHttp(TOKEN_DHT22,JsonDataString);
Serial.println("Temp: " + String(data.temperature, 2) + "°C");
Serial.println("Humidity: " + String(data.humidity, 1) + "%");
}
// tb.loop();
}
void SendHttp(String token,String dataJsonString){
if(WiFi.status() != WL_CONNECTED){
return;
}
HTTPClient http;
String url = "http://";
url+=THINGSBOARD_SERVER;
url+="/api/v1/";
url+=token;
url+="/telemetry";
http.begin(espClient, url);
http.addHeader("Content-Type", "application/json");
int httpResponseCode = http.POST(dataJsonString);
Serial.println(httpResponseCode);
Serial.println(url);
Serial.println(dataJsonString);
// Free resources
http.end();
}
void setup()
{
Serial.begin(115200);
InternetConnection();
InitMPU();
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
}
void loop()
{
// heartRateLogic();
DHT_logic();
// Gps_logic();
// MPU_logic();
}