#include #include "Arduino.h" #include #include #include "LoRaWan_APP.h" #include #include #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET 21 #define OLED_SDA 17 #define OLED_SCL 18 #define LIGHT_SENSOR_PIN 1 #define RF_FREQUENCY 868100000 #define TX_OUTPUT_POWER 5 #define LORA_BANDWIDTH 0 #define LORA_SPREADING_FACTOR 7 #define LORA_CODINGRATE 1 #define LORA_PREAMBLE_LENGTH 8 #define LORA_SYMBOL_TIMEOUT 0 #define LORA_FIX_LENGTH_PAYLOAD_ON false #define LORA_IQ_INVERSION_ON false #define BUFFER_SIZE 50 char txpacket[BUFFER_SIZE]; bool lora_idle = true; static RadioEvents_t RadioEvents; void OnTxDone(void); void OnTxTimeout(void); Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); void setup() { Serial.begin(115200); Mcu.begin(HELTEC_BOARD, SLOW_CLK_TPYE); RadioEvents.TxDone = OnTxDone; RadioEvents.TxTimeout = OnTxTimeout; Radio.Init(&RadioEvents); Radio.SetChannel(RF_FREQUENCY); Radio.SetTxConfig(MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, LORA_CODINGRATE, LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, true, 0, 0, LORA_IQ_INVERSION_ON, 3000); Wire.begin(OLED_SDA, OLED_SCL); if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("Échec de l'initialisation OLED")); while(true); } oled.clearDisplay(); oled.setTextSize(1); oled.setTextColor(SSD1306_WHITE); oled.setCursor(0, 10); oled.println("Hey you ! <3" ); oled.display(); } void loop() { if (lora_idle) { delay(5000); int sensorValue = analogRead(LIGHT_SENSOR_PIN); float percentile = (sensorValue * 100.0) / 2430.0; char percentileLine[30]; sprintf(percentileLine, "%.1f%%", percentile); char adviceLine[30]; if (percentile > 75) { strcpy(adviceLine, "Too bright"); } else if (percentile < 25) { strcpy(adviceLine, "Too dark !"); } else { strcpy(adviceLine, "I'm fine :)"); } const char* lines[] = { "Sensor value", percentileLine, adviceLine }; displayMultipleMessages(lines, 3); // Préparer le paquet JSON snprintf(txpacket, BUFFER_SIZE, "{\"lightSensorValue\": %d}", sensorValue); Serial.printf("\r\nSending packet: %s\n", txpacket); Radio.Send((uint8_t*)txpacket, strlen(txpacket)); lora_idle = false; } Radio.IrqProcess(); } void displayMultipleMessages(const char* messages[], int numLines) { oled.clearDisplay(); oled.setTextSize(1); oled.setTextColor(SSD1306_WHITE); int lineHeight = 16; for (int i = 0; i < numLines; i++) { oled.setCursor(0, i * lineHeight); oled.println(messages[i]); } oled.display(); } void OnTxDone(void) { Serial.println("TX done..."); lora_idle = true; } void OnTxTimeout(void) { Radio.Sleep(); Serial.println("TX Timeout..."); lora_idle = true; }