ESP, IoT [BigClock] Большие часы на WS2812, ESP8266, Народный мониторинг

Какой вариант датчика используется у вас? Интересно, использует ли кто BME280, как у меня?)

  • BMP280

    Голосов: 26 26.8%
  • BME280

    Голосов: 71 73.2%

  • Всего проголосовало
    97

Romshteks

✩✩✩✩✩✩✩
13 Май 2020
43
4
@Romshteks, Значит проверьте присваивается ли ей значение кроме 0, выведите эту переменную в отладку.
Не вижу смысла.У меня на столе в живую всё лежит.)

У меня в голове не складывается как вот этот код работает:
C++:
mp3.playMP3Folder((r.golos * 100) + (hour) ? hour : 24);
да и в железе работает не правильно.
А этот код:
C++:
mp3.playMP3Folder(hour ? (hour + r.golos * 100) : (24 + r.golos * 100));
я понимаю и работает он как надо.
 

Sergo_ST

★★★★★★✩
15 Мар 2020
1,093
884
@Romshteks, Из-за тернальной операции, сначала собирается матиматика, потом логика, а тк тернальная операция не была выделена в скобки, сначала считалось это:
C++:
(r.golos * 100) + (hour)
А затем только выполнялось логическое условие, на основе результата матиматих вычислений, если проще, то можно представить это было так:
C++:
if ((r.golos * 100) + (hour)) mp3.playMP3Folder(hour);
else mp3.playMP3Folder(24);
Отсюда и проблема что работал только первый голос.
Поэтому правильно будет как привёл выше.
 

Sergo_ST

★★★★★★✩
15 Мар 2020
1,093
884
@Romshteks, Выбранным, 0 часов же у вас это файл 0024(0124, 0224). Для этого там и нужно это условие. Если переместить файл "0 часов" под номером 0001, а остальные сместить на +1, то это условие уже не нужно будет, и выбор трека будет выглядеть так:
C++:
mp3.playMP3Folder(((uint16_t)r.golos * 100) + hour + 1);
 
Изменено:

Romshteks

✩✩✩✩✩✩✩
13 Май 2020
43
4
Итого:
КОД:
//[I]░░░▒▒▒▓▓▓ ♫ Кукушка by Romshteks ♫ ▓▓▓▒▒▒░░░[/I]\\

//    [I]░░░▒▒▒▓▓▓ ♪ V2 Без delay ♪ ▓▓▓▒▒▒░░░[/I]    \\

//      [I]░░░▒▒▒▓▓▓ ♂ 3 Голоса ♀ ▓▓▓▒▒▒░░░[/I]      \\


void kuku_tick() {
  if (r.status_kuku) {
    if (hour >= r.start_kuku && hour <= r.stop_kuku) {
      if (minute == 0 && flag_kuku == 1) {
        DFPlayer();
        flag_kuku = 0;
      }
      if (minute == 59 && flag_kuku == 0) {
        flag_kuku = 1;
      }
      Vremy();
      Utro();
      Vecher();
    }
  }
}

//////////// Функция DFPlayer
/*
[*]автор Maxx1200
[*]Каждый час будет говорить время!
*/
/***************************************************************************************************/
/*
   исходный код: https://github.com/enjoyneering/DFPlayer

   Возможности DFPlayer Mini:
    - 3,2В..5,0В, обычно 4,2В
    - microSD-карта до 32 ГБ (FAT16, FAT32)
    - USB-диск до 32 ГБ (FAT16, FAT32)
    - поддерживает частоту дискретизации mp3 8кГц, 11,025кГц, 12кГц, 16кГц, 22,05кГц, 24кГц, 32кГц, 44,1кГц, 48кГц
    - поддерживает до 100 папок, каждая папка может быть назначена на 001..255 песен
    - встроенный моноусилитель мощностью 3 Вт, NS8002 AB-класса с функцией ожидания
    - UART для связи, 9600 бит/с (четность: нет, биты данных: 8, стоповые биты: 1, управление потоком: нет)

    ПРИМЕЧАНИЕ:
    - добавьте резистор 1K последовательно с выводом DFPlayer TX

   Фреймворки и библиотеки:
   ESP8266 Core      -  https://github.com/esp8266/Arduino
   EspSoftwareSerial -  https://github.com/plerup/espsoftwareserial
*/
/***************************************************************************************************/
void DFPlayer_setup() {

  Serial.println("Инициализация DFPlayer... (может занять 3~5 секунд)");                                      //для отладки
  mp3Serial.begin(MP3_SERIAL_SPEED, SWSERIAL_8N1, MP3_RX_PIN, MP3_TX_PIN, false, MP3_SERIAL_BUFFER_SIZE, 0);  //false=сигнал не инвертирован, 0=размер буфера ISR/RX (общий с последовательным буфером TX)
  mp3.begin(mp3Serial, MP3_SERIAL_TIMEOUT, DFPLAYER_HW_247A, false);                                          //"DFPLAYER_HW_247A" см. ПРИМЕЧАНИЕ, false = нет обратной связи от модуля после команды
  mp3.stop();                                                                                                 //если плеер работал во время перезагрузки ESP8266
  mp3.reset();                                                                                                //сбросить все настройки по умолчанию
  mp3.setSource(2);                                                                                           //1=USB-диск, 2=TF-карта, 3=Aux, 4=спящий режим, 5=NOR Flash
  mp3.setEQ(0);                                                                                               //0=Выкл., 1=Поп, 2=Рок, 3=Джаз, 4=Классика, 5=Бас
  mp3.setVolume(r.grom_mp3);                                                                                  //0..30, модуль сохраняет громкость при сбое питания

  Serial.print(" ♫ Громкость: ");   //для отладки, Получить громкость
  Serial.println(mp3.getVolume());  //0..30

  mp3Serial.enableRx(false);  //отключить прерывания на RX-контакте, меньше накладных расходов, чем mp3Serial.listen()

  mp3.playMP3Folder(26);
  Serial.println(" ♫ Приветствие");  // Музыкальное приветствие
}

void DFPlayer() {            // Функция срабатывающая раз в час
  if (r.status_kuku) {       // Если кукушка включена(проверка второй раз для корректной работы портала)
    if (r.kuku_mp3_check) {  // Если включено воспроизведение кукушки
      Serial.println(" ♫ Ку-Ку");
      mp3.playMP3Folder(25);  // проигрываем файл c кукушкой
    }
    if (r.vrem_mp3_check) Vremy_flag = 1;
  }
}

void Vremy() {
  static uint32_t VremyTime;
  if (Vremy_flag == 1) {
    VremyTime = millis();
    Vremy_play_flag = 1;
    Vremy_flag = 0;
  }
  if (Vremy_play_flag == 1 && (millis() - VremyTime) >= 3000) {  // Пауза чтобы выговорилась кукушка

    // mp3.playMP3Folder((r.golos * 100) + (hour) ? hour : 24);
    // mp3.playMP3Folder(hour ? (hour + r.golos * 100) : (24 + r.golos * 100));
    mp3.playMP3Folder((r.golos * 100) + hour + 1);
    Serial.println((String) " ♫ " + hour + " часов");

    if (hour == r.start_kuku) Utro_flag = 1;
    if (hour == r.stop_kuku) Vecher_flag = 1;
    Vremy_play_flag = 0;
  }
}

void Utro() {
  static uint32_t utroTime;
  if (Utro_flag == 1) {
    utroTime = millis();
    Utro_play_flag = 1;
    Utro_flag = 0;
  }
  if (Utro_play_flag == 1 && (millis() - utroTime) >= 3000) {  // Пауза чтобы выговорилось время
    mp3.playMP3Folder((r.golos * 100) + 27);
    Serial.println(" ♫ Доброе утро");  //для отладки
    Utro_play_flag = 0;
  }
}
void Vecher() {
  static uint32_t VecherTime;
  if (Vecher_flag == 1) {
    VecherTime = millis();
    Vecher_play_flag = 1;
    Vecher_flag = 0;
  }
  if (Vecher_play_flag == 1 && (millis() - VecherTime) >= 3000) {  // Пауза чтобы выговорилось время
    mp3.playMP3Folder((r.golos * 100) + 28);
    Serial.println(" ♫ Доброй ночи");  //для отладки
    Vecher_play_flag = 0;
  }
}
 

ASM

★★★★★✩✩
26 Окт 2018
1,918
422
над этим вариантом кто что думает?) стоит переносить?)

Все сейчас работает.
Звук только нечеткий в динамике от наушников.
Есть от колонки на 5Вт, хватит ли их?)
 
Изменено:

ASM

★★★★★✩✩
26 Окт 2018
1,918
422
C++:
struct GP_THEME {
  char typeTheme[10] = "GP_LIGHT";   // доступные темы: GP_LIGHT, GP_DARK
  char colorTheme[10] = "GP_GREEN";  // доступные цвета GP_RED, GP_PINK, GP_VIOL, GP_BLUE, GP_CYAN, GP_GREEN, GP_YELLOW, GP_ORANGE, GP_GRAY, GP_BLACK, GP_WHITE
};
GP_THEME t;
думаю добавить оформление портала.
самое простое, это понадеяться на правильность ввода пользователем)
а лучше сделать выбор через select?)
тогда каждому цвету присваивать порядковый номер. Делать через switch?)
C++:
struct GP_THEME {
  bool portalTheme = 0;  // 0 - GP_LIGHT, 1 - GP_DARK
  byte colorTheme = 6;   // 1 - GP_RED, 2 - GP_PINK, 3 - GP_VIOL, 4 - GP_BLUE, 5 - GP_CYAN, 6 - GP_GREEN,
                         // 7 - GP_YELLOW, 8 - GP_ORANGE, 9 - GP_GRAY, 10 - GP_BLACK, 11 - GP_WHITE
};
GP_THEME t;
 
Изменено:

kym13

★★★✩✩✩✩
14 Ноя 2020
716
118
@ASM, ... Есть от колонки на 5Вт, хватит ли их?)... Может не потянуть( тихо будет) в плеере усилитель 3-х ватный. Вообще громкость может зависеть от сопротивления динамиков при одинаковой мощности 4 омные звучат громче 8-ми омных, проверено.
 

Medwed76

✩✩✩✩✩✩✩
17 Июл 2021
36
2
Всем привет, подскажите, использую bmp280, выдаёт неправильную температуру -127 и 0 давление. Датчик менял. Куда копать?
 

ASM

★★★★★✩✩
26 Окт 2018
1,918
422
@Medwed76, это разные датчики. Надо проверять, уже не помню) не у ПК сейчас)
 

kym13

★★★✩✩✩✩
14 Ноя 2020
716
118
@Medwed76, Посмотрите в скетче какая библиотека установлена ВМР280 или ВМЕ 280, если ВМЕ то датчик ВМР работать не будет.
 

Medwed76

✩✩✩✩✩✩✩
17 Июл 2021
36
2
@kym13, решил обновить прошивку, теперь в порте только время, температура и давление по 0.

Как прописать bmp, не силён в программировании:(
 
Изменено:

kym13

★★★✩✩✩✩
14 Ноя 2020
716
118
@Medwed76, ...Как прописать bmp..... Это к ASM, он здесь гуру программирования.:)
 

ASM

★★★★★✩✩
26 Окт 2018
1,918
422
гуру программирования
я только учусь)) я так надеялся, что тут уже набросали идеи по датчику и прошлому вопросу про цвета)
сможете помочь?
надо подумать тогда, как уместить два варианта)

C++:
bool BME280::beginI2C(TwoWire &wirePort)
{
...
    if(chipID == 0x58) return(true); //Begin normal init with these settings. Should return chip ID of 0x58 for BMP
    if(chipID == 0x60) return(true); //Begin normal init with these settings. Should return chip ID of 0x60 for BME
...
}
датчики совместимы в библиотеке)
в коде используется для bme адрес 0x76, для bmp какой адрес? надо подключать и сканить...
п.с. подключил, адрес тот же
Код:
I2C device found at address 0x76
 
Изменено:

ASM

★★★★★✩✩
26 Окт 2018
1,918
422
Сканер от библиотеки
C++:
#include <Wire.h>
#include "SparkFunBME280.h"
BME280 mySensorA;  //Uses default I2C address 0x77
BME280 mySensorB;  //Uses I2C address 0x76 (jumper closed)

void setup() {
  Serial.begin(115200);
  Serial.println("Example showing alternate I2C addresses");
  Wire.begin();
  mySensorA.setI2CAddress(0x77);  //The default for the SparkFun Environmental Combo board is 0x77 (jumper open).
  //If you close the jumper it is 0x76
  //The I2C address must be set before .begin() otherwise the cal values will fail to load.
  if (mySensorA.beginI2C() == false) Serial.println("Sensor A connect failed");
  mySensorB.setI2CAddress(0x76);  //Connect to a second sensor
  if (mySensorB.beginI2C() == false) Serial.println("Sensor B connect failed");
}

void loop() {
  Serial.print("HumidityA: ");
  Serial.print(mySensorA.readFloatHumidity(), 0);
  Serial.print(" PressureA: ");
  Serial.print(mySensorA.readFloatPressure(), 0);
  Serial.print(" TempA: ");
  //Serial.print(mySensorA.readTempC(), 2);
  Serial.print(mySensorA.readTempF(), 2);
  Serial.print(" HumidityB: ");
  Serial.print(mySensorB.readFloatHumidity(), 0);
  Serial.print(" PressureB: ");
  Serial.print(mySensorB.readFloatPressure(), 0);
  Serial.print(" TempB: ");
  //Serial.print(mySensorB.readTempC(), 2);
  Serial.print(mySensorB.readTempF(), 2);
  Serial.println();
  delay(50);
}
Код:
HumidityA: 0 PressureA: 0 TempA: 32.00 HumidityB: 0 PressureB: 98614 TempB: 78.55
вывод и температуры и давления есть)
@Medwed76 проверяй, как у тебя?)

залил скетч на пустую плату с датчиком bmp280
Код:
13:22:1 //время
26 | 26.02  // темп с bmp
-127 | -127.00 // темп c ds18, его нет, показаний соответственно нет
739 // давление с bmp
0  // влажность
все работает как надо))
 
Изменено:

ASM

★★★★★✩✩
26 Окт 2018
1,918
422
Модуль плеера весь мозг мне вынес. После очередной прошивки ESP уходила в ребут.
Потратил кучу времени на исправление, загрузку других версий, загрузку на другую плату...
В итоге обрезал питание от плеера и все заработало)
Надо думать, что можно сделать с ним.
 

ASM

★★★★★✩✩
26 Окт 2018
1,918
422
@Старик Похабыч, убрал питание плеера, перезагрузка esp прекратилась. В динамике отчётливо слышно было перезагрузки.
Не хотелось бы добавлять тумблер для плеера) что можно предпринять?)