diff --git a/316920__rudmer-rotteveel__chicken-single-alarm-call.wav b/316920__rudmer-rotteveel__chicken-single-alarm-call.wav new file mode 100644 index 0000000..3d62ebc Binary files /dev/null and b/316920__rudmer-rotteveel__chicken-single-alarm-call.wav differ diff --git a/alarm.wav b/alarm.wav new file mode 100644 index 0000000..855e382 Binary files /dev/null and b/alarm.wav differ diff --git a/space_debris.mod b/space_debris.mod new file mode 100644 index 0000000..141cdd6 Binary files /dev/null and b/space_debris.mod differ diff --git a/src/BME280.cpp b/src/BME280.cpp index 80a5de2..ac7accd 100644 --- a/src/BME280.cpp +++ b/src/BME280.cpp @@ -13,17 +13,12 @@ bool BME280::begin(void) { // SPI.begin(BME_SCK, BME_MISO, BME_MOSI, BME_CS); pinMode(18, OUTPUT); digitalWrite(18, HIGH); // disable LoRa_CS - pinMode(23, OUTPUT); - digitalWrite(23, HIGH); // enable bme280 CS - delay(50); + pinMode(BME_CS, OUTPUT); + digitalWrite(BME_CS, LOW); // enable bme280 CS + delay(100); bme = new Adafruit_BME280(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI - int retries = 0; - while (!(valid = bme->begin())) { - if (retries > 5) break; - retries++; - Serial.println("Could not find a valid BME280 sensor, check wiring!"); - delay(500); - } + valid = bme->begin(); + if (!valid) bme->init(); if (!valid) return false; bme->setSampling(Adafruit_BME280::sensor_mode::MODE_NORMAL, @@ -45,8 +40,29 @@ void BME280::sleep() { Adafruit_BME280::standby_duration::STANDBY_MS_1000); } -void BME280::init() { - bme->init(); +bool BME280::reinit() { + pinMode(18, OUTPUT); + digitalWrite(18, HIGH); // disable LoRa_CS + pinMode(BME_CS, OUTPUT); + digitalWrite(BME_CS, LOW); // enable bme280 CS + + int retries = 0; valid = false; + while (!valid) { + if (retries > 9) break; + valid = bme->init(); + retries++; + + delay(100); + float p = bme->readPressure() / 100.0F; + if (p < 300 || p > 1100) valid = false; + +// constexpr byte BME280_REGISTER_SOFTRESET = 0xE0; +// bme->write8(BME280_REGISTER_SOFTRESET, 0xB6); + } + if (!valid) { + Serial.println("Could not find a valid BME280 sensor, check wiring!"); + return false; + } } void BME280::printValues() { diff --git a/src/BME280.h b/src/BME280.h index 4f1f61d..fe48037 100644 --- a/src/BME280.h +++ b/src/BME280.h @@ -18,7 +18,7 @@ class BME280 { public: BME280(); bool begin(void); - void init(void); + bool reinit(void); void printValues(void); float readTemperature(void); float readPressure(void); diff --git a/src/hardware.h b/src/hardware.h index 2456348..a05bb66 100644 --- a/src/hardware.h +++ b/src/hardware.h @@ -19,6 +19,14 @@ static constexpr uint8_t ext_wakeup_pin_2 = 0; static constexpr uint32_t secondsToSleep = 15*60; static constexpr int batteryLimit = 2800; +#define SX1276_SCK 5 +#define SX1276_MISO 19 +#define SX1276_MOSI 27 +#define SX1276_CS 18 +#define SX1276_RST 14 +#define SX1276_IRQ 26 +#define SX1276_BAND 868 + /* Wiring (Heltec OLED Lora) * GND O O GND diff --git a/src/main.cpp b/src/main.cpp index 5d7e473..10a1a63 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -26,6 +26,8 @@ #include #include "apps/sntp/sntp.h" +//#include + #include "driver/rtc_io.h" #include "main.h" @@ -38,6 +40,8 @@ extern "C" { int rom_phy_get_vdd33(); +//uint8_t temprature_sens_read(); +//uint32_t hall_sens_read(); } U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ 16, /* clock=*/ 15, /* data=*/ 4); @@ -126,12 +130,23 @@ void setup() { strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo); Serial.print("Current time: "); Serial.println(strftime_buf); +/* SPI.begin(SX1276_SCK, SX1276_MISO, SX1276_MOSI, SX1276_CS); + LoRa.setPins(SX1276_CS, SX1276_RST, SX1276_IRQ);// set CS, reset, IRQ pin + + if (!LoRa.begin(SX1276_BAND)) { // initialize ratio at 915 MHz + Serial.println("LoRa init failed. Check your connections."); + while (true); // if failed, do nothing + }*/ + bme280.begin(); - bme280.printValues(); +// bme280.printValues(); if (wakeup_reason == ESP_SLEEP_WAKEUP_TIMER) { for (int i=0; i<15 && iot.wifi.status() != WL_CONNECTED; i++) delay(500); - if (iot.wifi.status() == WL_CONNECTED) transmitStatus(); + if (iot.wifi.status() == WL_CONNECTED) { + transmitStatus(); + obtain_time(); + } double seconds = difftime(now, mktime(&alarmTime)); Serial.printf("alarm in %f seconds\n", seconds); @@ -149,6 +164,7 @@ void setup() { menuChange = eMainScreen; u8g2.setContrast(127); + //Set up the Callbacks for the MQTT instance. Refer to the Async MQTT Client documentation // TODO: We should do this actually _before_ connecting the mqtt client... iot.mqtt.onConnect(onMqttConnect); @@ -172,6 +188,9 @@ void setup() { time(&now); } + if (timeinfo.tm_hour < 7 || timeinfo.tm_hour > 23) u8g2.setContrast(1); + else u8g2.setContrast(127); + mp3.begin(); led.setup(); @@ -199,8 +218,11 @@ void transmitStatus() { float humi = bme280.readHumidity(); float pres = bme280.readPressure(); + float internal_temp = temperatureRead(); + int internal_hall = hallRead(); + for (int retry=0; retry<3 && !bme280.valid; retry++) { - bme280.init(); + bme280.reinit(); delay(250); humi = bme280.readHumidity(); bme280.readPressure(); @@ -209,14 +231,18 @@ void transmitStatus() { StaticJsonBuffer<200> jsonBuffer; JsonObject& root = jsonBuffer.createObject(); - root["temperature"] = bme280.readTemperature(); - root["humidity"] = bme280.readHumidity(); - root["pressure"] = bme280.readPressure(); + if (bme280.valid) { + root["temperature"] = bme280.readTemperature(); + root["humidity"] = bme280.readHumidity(); + root["pressure"] = bme280.readPressure(); + } else { + root["temperature"] = internal_temp; + } char sensorBuf[root.measureLength()+1]; root.printTo(sensorBuf, sizeof(sensorBuf)); uint16_t statusPacketIdSub; - if (bme280.valid) statusPacketIdSub = iot.mqtt.publish(bme280Topic.c_str(), 0, false, sensorBuf); + statusPacketIdSub = iot.mqtt.publish(bme280Topic.c_str(), 0, false, sensorBuf); // statusPacketIdSub = iot.mqtt.publish(bme280Topic.c_str(), 1, true, sensorBuf); int voltage = rom_phy_get_vdd33(); char batteryBuf[9]; @@ -267,8 +293,7 @@ void suspend(uint32_t secondsToSleep) { u8g2.sendBuffer(); u8g2.setFont(u8g2_font_inb19_mf); u8g2.drawStr(0, 20, timeStr); - // ToDo: set rtc gpio resistors - //rtc_gpio_hold_en((gpio_num_t)16); + rtc_gpio_hold_en((gpio_num_t)16); // 16 not connected to ulp processor :( esp_sleep_enable_timer_wakeup(1000000LL * 60); } diff --git a/src/mp3.cpp b/src/mp3.cpp index 8ed9939..f809ee2 100644 --- a/src/mp3.cpp +++ b/src/mp3.cpp @@ -19,6 +19,8 @@ char titleStr[64]; +// convert mp3 files with `xxd -i alarm.wav > alarmsound.h` + MP3::MP3() { strncpy_P(URL, "http://streaming.shoutcast.com/80sPlanet?lang=en-US", sizeof(URL)); //const char *URL="http://swr-swr1-bw.cast.addradio.de/swr/swr1/bw/mp3/64/stream.mp3";