#include <WiFi.h> //inserisco qui le librerie che mi occorrono
#include <MPU6050_light.h>
//MI SERVE COLLEGARE MPU6050 per questo inserisco la libreria
//DEVO COLLEGARE SCL E SDA PER ABILITARE IL PROTOCOLLO DI COMUNICAZIONE I2C A GPIO22 E GPIO21
//COLLEGO ANCHE TERRA E VCC ALL'ESP32
#include "ThingSpeak.h"
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
Adafruit_MPU6050 mpu; //variabile MPU
//alimentazione 3V-5V MPU6050
//alimentazione 3.3 ottimale per ESP32
const int mpuAddress = 0x68; // indirizzo protocollo I2C del MPU6050
#define SECRET_CH_ID 2442097 // serve per abilitare la connessione con ThingSpeak
#define SECRET_WRITE_APIKEY "95KHC2PV9STKZYN5" //API di ThingSpeak
//Questi dati li ho una volta che ho creato un canale su ThingSpeak
WiFiClient client; //WiFi client per connettermi a thingSpeak
//definisco alcune costanti
unsigned long myChannelNumber = SECRET_CH_ID;
const char * myWriteAPIKey = SECRET_WRITE_APIKEY;
unsigned long lastTime = 0;
//timerDelay è la variabile relativa a quanto frequentemente voglio pubblicare
//in questo caso voglio pubblicare ogni 10 secondi (10000 millisec)
unsigned long timerDelay = 10000;
//
//Di quando posso diminuire il timerDelay senza richiamare l'errore 401???
//
void setup() { //informazioni necessarie prima dell'esecuzione del programma
pinMode(2, OUTPUT); //setto i pin di connessione di MPU6050
Serial.begin(115200); //setto il baud rate (velocità di trasmissione)
Wire.begin(); //inizio della comunicazione
Wire.beginTransmission(mpuAddress);
Wire.write(0x6B); //setto alcuni registri
Wire.write(0x00);
Wire.endTransmission(mpuAddress);
//configuriamo la sensibilità dell'accelerometro +-2g
Wire.beginTransmission(mpuAddress);
Wire.write(0x1C);
Wire.write(0x10); //setto il registro per la sensibilità del sensore
Wire.endTransmission(true);
ThingSpeak.begin(client); // inizializzo la connessione con ThingSpeak
//faccio un controllo sul sensore
//
//
Serial.println("Test sul sensore MPU6050 Adafruit");
if (!mpu.begin()){
Serial.println ("Test fallito! Controllare se il sensore è correttamente collegato");
while (1){
delay(10);
}
}
Serial.println ("MPU6050 trovato!");
}
void loop() { // informazioni relative all'esecuzione del programma e comandi relativi
sensors_event_t a, g, temp; //richiamo alcune funzioni della libreria MPU6050
mpu.getEvent(&a, &g, &temp);
if ((millis() - lastTime) > timerDelay) { // timerDelay relativo a quando inviare i dati sulla piattaforma
Serial.println("MI STO CONNETTENDO AL WIFI"); //mi connetto alla rete di prova di Wokwi
WiFi.begin("Wokwi-GUEST", "", 6 ); //rete Guest Wokwi
while (WiFi.status() != WL_CONNECTED){ //controllo sulla connessione
delay(100);
}
Serial.println("\nCONNESSO"); //stampa a video il risultato della connessione se positivo
Serial.print("Accelerometer ");
Serial.print("X: ");
Serial.print(a.acceleration.x, 1); //richiamo le funzioni per visualizzare le Acc lungo i vari assi
Serial.print(" m/s^2, ");
Serial.print("Y: ");
Serial.print(a.acceleration.y, 1); //visualizzo AccY
Serial.print(" m/s^2, ");
Serial.print("Z: ");
Serial.print(a.acceleration.z, 1); //Visualizzo AccZ
Serial.println(" m/s^2");
//setto i Field: dico ogni dato dove dovrà essere stampato a video (il grafico corrispondente in thingspeak)
ThingSpeak.setField(1, a.acceleration.x); //AccX nel grafico 1
ThingSpeak.setField(2, a.acceleration.y); //AccY nel grafico 2
ThingSpeak.setField(3, a.acceleration.z); //AccZ nel grafico 3
//questa funzione mi permette di scrivere i dati su Thingspeak
//grazie al numero del canale e all'API
int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if(x == 200){ //effettuo un conrollo sulla riuscita scrittura dei dati in Thingspeak
Serial.println("Channel update successful.");
}
else{
Serial.println("Problem updating channel. HTTP error code " + String(x));
for(;;); //interrompe lo sketch se si verifica un errore
}
//con il controllo sulla variabile "x" riesco a capire quale sia la tipologia di errore
lastTime = millis(); //chiudo l'if
//delay(100); //setto la velocità della simulazione
}
}
//Questo sensore è anche Giroscopio, quindi potrei visualizzare anche i dati
//del giroscopio lungo x,y,z
//Ha anche un sensore di temperatura, per cui posso visualizzare anche la T
//Mi occorrono di più i dati di Acc o del Giroscopio?? DA VALUTARE
//Devo procedere elaborando i dati del sensore e mettere alcune condizioni
//sui dati che invio sulla piattaforma-->filtraggio sui dati
//Devo anche comprendere il significato dei dati che invio--> come si sta muovendo la sonda a seconda dei dati che mi arrivano?
//Devo effettuare una buona calibrazione
//Elaborazione MATLAB??????
// Wire.requestFrom(mpuAddress,6,true);
// AccX= (Wire.read()<<8 | Wire.read()) /16384;
// Serial.print("Accelerometer ");
// Serial.print("X: ");
// Serial.print(AccX, 1);
//altra tipologia di controllo fatta sul registro, funziona ugualmente ma
//preferisco l'altra perchè c'è meno codice da compilare
// Wire.beginTransmission(mpuAddress);
// Wire.write(0x6B); //registro
// Wire.write(0); //setto a zero così si sveglia MPU6050
// auto error = Wire.endTransmission();
// if( error != 0)
// {
// Serial.println(F( "Error, MPU-6050 not found"));
// for(;;); //interrompe lo sketch se si verifica un errore
// }
//
//
//if ((millis() - lastTime) > timerDelay) {
// lastTime = millis();
//}
// int x = ThingSpeak.writeField(myChannelNumber, 1, AccX , myWriteAPIKey);
// if(x == 200){
// Serial.println("Channel update successful.");
// }
// else{
// Serial.println("Problem updating channel. HTTP error code " + String(x));
// for(;;); //interrompe lo sketch se si verifica un errore
// }