#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
#include <CuteBuzzerSounds.h>
#include <ArduinoJson.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <NTPClient.h>
int tempo_up=0;
int tempo_down=0;
String allarme="0";
int conteggio=0;
const char *ssid = "Wokwi-GUEST"; //Enter your WIFI ssid
const char *pass = ""; //Enter your WIFI password
WiFiClient wifiClient;
PubSubClient client(wifiClient);
const char outTopic[] = "dibris/command";
const char broker[] = "test.mosquitto.org";
int port= 1883;
#define BUZZER_PIN 5
Adafruit_MPU6050 mpu;
void setup() {
delay(3000);
Serial.begin(115200);
Serial.print("Configuring access point...");
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.print("");
Serial.print("WiFi connected");
Serial.print("IP address: ");
Serial.print(WiFi.localIP());
delay(5000);
Serial.print("Attempting to connect to the MQTT broker: ");
Serial.print(broker);
client.setServer(broker, port);
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
if (client.connect("ESP32Client")) {
Serial.print("connected");
} else {
Serial.print("failed with state ");
Serial.print(client.state());
delay(2000);
}
}
Serial.print("You're connected to the MQTT broker!");
//Serial.println();
pinMode(BUZZER_PIN, OUTPUT);
if (!mpu.begin()) {
Serial.println("Sensor init failed");
while (1)
yield();
}
Serial.println("Found a MPU-6050 sensor");
//set del range dell'accelerometro come quello di wokwi
mpu.setAccelerometerRange(MPU6050_RANGE_2_G);
switch (mpu.getAccelerometerRange()) {
case MPU6050_RANGE_2_G:
Serial.print("+-2G");
break;
}
//set del range del giroscopio come quello di wokwi
mpu.setGyroRange(MPU6050_RANGE_250_DEG);
switch (mpu.getGyroRange()) {
case MPU6050_RANGE_250_DEG:
Serial.print("+- 250 deg/s");
break;
}
digitalWrite(BUZZER_PIN, LOW);
}
void reconnect() {
while (!client.connected()) {
Serial.println("Attempting MQTT connection...");
if (client.connect("")) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
int64_t xx_time_get_time() {
struct timeval tv;
gettimeofday(&tv, NULL);
return (tv.tv_sec * 1000LL + (tv.tv_usec / 1000LL));
}
void loop() {
reconnect();
sensors_event_t a, g, t;
mpu.getEvent(&a, &g, &t);
Serial.print("Accelerometer ");
Serial.print("X: ");
Serial.print(a.acceleration.x, 1);
Serial.print(" m/s^2, ");
Serial.print("Y: ");
Serial.print(a.acceleration.y, 1);
Serial.print(" m/s^2, ");
Serial.print("Z: ");
Serial.print(a.acceleration.z, 1);
Serial.println(" m/s^2");
Serial.print("Gyroscope ");
Serial.print("X: ");
Serial.print(g.gyro.x, 1);
Serial.print(" rps, ");
Serial.print("Y: ");
Serial.print(g.gyro.y, 1);
Serial.print(" rps, ");
Serial.print("Z: ");
Serial.print(g.gyro.z, 1);
Serial.println(" rps");
//avviso sonoro se movimento eccessivo avanti/indietro o sx/dx
//abbiamo moltiplicato per 4.4/250
if(g.gyro.x>0.352 || g.gyro.x<-0.352 ||g.gyro.z>0.352 || g.gyro.z <-0.352) {
digitalWrite(BUZZER_PIN, HIGH); // turn on
if(allarme=="0") //inizio dell'avviso sonoro
{
conteggio=conteggio+1;
tempo_up=xx_time_get_time(); //tempo in ms
Serial.print(tempo_up);
}
allarme="1";
}
else{
digitalWrite(BUZZER_PIN, LOW); // turn off
if(allarme=="1")
{
tempo_down=xx_time_get_time(); //tempo in ms
Serial.print(tempo_down);
}
allarme="0";
}
Serial.print("Send:");
StaticJsonDocument<256> doc;
doc["allarme"] = allarme;
doc["conteggio"] = String(conteggio);
doc["durata"] = String(tempo_down-tempo_up);
char buffer[256];
serializeJson(doc, buffer);
client.publish("/dibris/command", buffer);
}