Hi y'all!!
I've been working for about 5hrs on a ESP32 project involving a BH1750 lightmeter, a barometric pressure sensor BMP280 and an OLED display. Everything works fine... but when I've integrated the code for the Arduino IoT Cloud the board (ESP32 Dev Board) suddenly resets when the ArduinoCloud.update(); function is called.
I've triple checked password, SSID etc. I just don't know why It keep resetting
Here's the full code of my project:
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include <BMx280I2C.h>
#include <BH1750.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SD.h>
#include <FS.h>
#include "thingProperties.h"
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 4
#define SD_CS 5
//float Temp, lum;
//int Pr;
//bool BMP_INIT = 0, BH_INIT = 0;
void SetWiFi();
void SetBMP(bool bmp_init);
void SetBH(bool bh1750_init);
void displayInit();
void displayOled(float t, float lu, int pr, bool bm_init, bool bh_init);
void SDinit();
void toSD(float t, float lu, int pr);
void appendFile(fs::FS &fs, const char * path, const char * message);
BMx280I2C bmp(0x76);
BH1750 lightMeter;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
File logFile;
void setup() {
Serial.begin(921600);
Wire.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
delay(5000);
display.clearDisplay();
display.display();
Serial.println("-------------------------------------------------------------");
Serial.println("BENVENUTO NEL SISTEMA METEO CLOUD BASED DI MONTORIO AL VOMANO");
Serial.println("Inizio configurazione sistemi:");
displayInit();
delay(5000);
SetWiFi();
delay(2000);
SetBMP(BMP_INIT); //0x76
ArduinoCloud.update();
delay(2000);
SetBH(BH_INIT);//0x23
ArduinoCloud.update();
//128x64 60y48b
delay(3000);
SDinit();
delay(3000);
Serial.println("-------------------------------------------------------------");
}
void loop() {
bmp.measure();
do{
delay(100);
} while (!bmp.hasValue());
Pr = bmp.getPressure();
Temp = bmp.getTemperature();
lum = lightMeter.readLightLevel();
Serial.print("Temperatura: ");
Serial.print(Temp);
Serial.println(" C");
Serial.print("Pressione Atmosferica: ");
Serial.print(Pr);
Serial.println(" Pa");
Serial.print("Luminosita': ");
Serial.print(lum);
Serial.println(" lux");
toSD(Temp, lum, Pr);
Serial.println("-------------------------------------------------------------");
displayOled(Temp, lum, Pr, BMP_INIT, BH_INIT);
ArduinoCloud.update();
delay(5000);
}
//----------------------------------------------------------------------------
void SetWiFi()
{
initProperties();
ArduinoCloud.begin(ArduinoIoTPreferredConnection);
setDebugMessageLevel(2);
ArduinoCloud.printDebugInfo();
Serial.print("\t-WiFi: ");
Serial.println("Settato correttamente;");
}
void SetBMP(bool bmp_init)
{
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.print("STAZIONE METEO");
display.setCursor(0,9);
display.print("MONTORIO AL VOMANO");
display.setCursor(0,18);
display.print("INIZIO CONFIGURAZIONE");
display.setCursor(0,27);
display.print("-BMP280:");
Serial.print("\t-BMP280: ");
if (!bmp.begin()) {
display.setCursor (48, 27);
display.print("Err");
display.display();
Serial.println(F("Connessione fallita"));
display.display();
Serial.println(F("Connessione fallita"));
while (1);
}
Serial.println("Connesso con successo");
display.setCursor (48, 27);
display.print("Conn avvenuta");
display.display();
bmp.resetToDefaults();
bmp.writeOversamplingPressure(BMx280I2C::OSRS_P_x16);
bmp.writeOversamplingTemperature(BMx280I2C::OSRS_T_x16);
bmp.writeOversamplingHumidity(BMx280I2C::OSRS_H_x16);
bmp_init = 1;
delay(1000);
}
void SetBH(bool bh1750_init)
{
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.print("STAZIONE METEO");
display.setCursor(0,9);
display.print("MONTORIO AL VOMANO");
display.setCursor(0,18);
display.print("INIZIO CONFIGURAZIONE");
display.setCursor(0,27);
display.print("-BMP280:Conn avvenuta");
display.setCursor(0,36);
display.print("-BH1750:");
Serial.print("\t-BH1750:");
if(!lightMeter.begin())
{
display.setCursor (48, 36);
display.print("Err");
display.display();
Serial.println(F("Connessione fallita"));
display.display();
while (1);
} else
{
Serial.println(F("Connesso con successo"));
display.setCursor (48, 36);
display.print("Conn avvenuta");
display.display();
bh1750_init = 1;
}
}
void displayInit()
{
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.print("STAZIONE METEO");
display.setCursor(0,9);
display.print("MONTORIO AL VOMANO");
display.setTextSize(0.5);
display.setCursor(0,18);
display.print("INIZIO CONFIGURAZIONE ");
display.display();
}
void displayOled(float t, float lu, int pr, bool bm_init, bool bh_init)
{
String Temperatura = "Temperatura: " + String(t) + " C";
String Pressione = "Pressione: " + String(pr) + " Pa";
String Luminosita = "Luce: " + String(lu) + " Lux";
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.print("STAZIONE METEO");
display.setCursor(0,9);
display.print("MONTORIO AL VOMANO");
display.setCursor(0,27);
display.print(Temperatura);
display.setCursor(0,36);
display.print(Pressione);
display.setCursor(0,45);
display.print(Luminosita);
display.display();
}
void toSD(float t, float lu, int pr)
{
String msg = String(t) + "," + String(lu) + "," + String(pr) + "\r\n";
appendFile(SD, "/METEO.txt", msg.c_str());
}
void SDinit()
{
Serial.print("\t-SDcard: ");
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.print("STAZIONE METEO");
display.setCursor(0,9);
display.print("MONTORIO AL VOMANO");
display.setCursor(0,18);
display.print("INIZIO CONFIGURAZIONE");
display.setCursor(0,27);
display.print("-BMP280:Conn avvenuta");
display.setCursor(0,36);
display.print("-BH1750:Conn avvenuta");
display.setCursor(0,45);
display.print("-MicroSD:");
display.display();
delay(1000);
if(!SD.begin(SD_CS))
{
Serial.println("Connessione fallita");
display.setCursor(48,45);
display.print("-Conn fallita");
display.display();
} else{
Serial.println("Connesso con successo");
display.setCursor(48,45);
display.print("Conn avvenuta");
display.display();
}
if(SD.exists("/METEO.txt"))
{
SD.remove("/METEO.txt");
Serial.println("File duplicato trovato ed eliminato");
display.setCursor(10,54);
display.print("File dupl eliminato");
display.display();
}
}
void writeFile(fs::FS &fs, const char * path, const char * message) {
Serial.printf("Scrittura file: %s\n", "/METEO.txt");
File file = fs.open("METEO.txt", FILE_WRITE);
if(!file) {
Serial.println("Fallimento nell'aprire il file");
return;
}
if(file.print(message)) {
Serial.println("File Scritto");
} else {
Serial.println("Scrittura fallita");
}
file.close();
}
// Append data to the SD card (DON'T MODIFY THIS FUNCTION)
void appendFile(fs::FS &fs, const char * path, const char * message) {
Serial.printf("Appending to file: %s\n", path);
File file = fs.open("/METEO.txt", FILE_APPEND);
if(!file) {
Serial.println("Failed to open file for appending");
return;
}
if(file.print(message)) {
Serial.println("Message appended");
} else {
Serial.println("Append failed");
}
file.close();
}
Here's the header file
// Code generated by Arduino IoT Cloud, DO NOT EDIT.
#include <ArduinoIoTCloud.h>
#include <Arduino_ConnectionHandler.h>
const char DEVICE_LOGIN_NAME[] = "++++";
const char SSID[] = "++++"; // Network SSID (name)
const char PASS[] = "++++"; // Network password (use for WPA, or use as key for WEP)
const char DEVICE_KEY[] = "++++"; // Secret device password
CloudIlluminance lum;
CloudPressure Pr;
bool BH_INIT;
bool BMP_INIT;
CloudTemperature Temp;
void initProperties(){
ArduinoCloud.setBoardId(DEVICE_LOGIN_NAME);
ArduinoCloud.setSecretDeviceKey(DEVICE_KEY);
ArduinoCloud.addProperty(lum, READ, ON_CHANGE, NULL);
ArduinoCloud.addProperty(Pr, READ, ON_CHANGE, NULL);
ArduinoCloud.addProperty(BH_INIT, READ, ON_CHANGE, NULL);
ArduinoCloud.addProperty(BMP_INIT, READ, ON_CHANGE, NULL);
ArduinoCloud.addProperty(Temp, READ, ON_CHANGE, NULL);
}
WiFiConnectionHandler ArduinoIoTPreferredConnection(SSID, PASS);