Большие часы на адресных светодиодах WS2812B

Большие часы на адресных светодиодах WS2812B
Всем привет, хочу рассказать о том как я попробовал повторить проект, но столкнулся с некоторыми проблемами.

Как-то раз на просторах зарубежного интернета я нашел вот такой проект часов на базе светодиодной ленты WS2812B: Big, Auto Dim, Room Clock, и мне захотелось его повторить. Часы устроены как семи сегментный циферблат и работают на RTC модуле DS3231 . Часы умеют показывать температуру, имеют кнопки для настройки и перевода на зимнее время и обратно, позже я добавил датчик влажности DHT11. Температура уже вместе с влажностью считывалась с этого датчика и выводилась раз в минуту. Хоть и в модуле часов есть температурный датчик, но похоже он показывал температуру не корректно из-за самонагрева (ИМХО).




Untitled Sketch_МП.png
И главное нанести много горячих соплей

IMG_20180907_120755.jpg


Когда все было собрано, повозившись с библиотеками, все заработало. И тут возникло одно большое НО: положения яркости в только в двух позициях меня не устраивало. Тем более на границе значений происходило мерцание. Установка яркости на статичном значении меня тоже не очень устраивала ибо днем при установленном тусклом свете ничего не было видно, а ночью даже со значениями близким к минимуму можно было осветить всю Москву. Поинтересовавшись как в других проектах с этим справляется Alex было решено заменить такой код настройки яркости.

C:
void BrightnessCheck(){
  const byte sensorPin = BRI_PIN; // light sensor pin
  const byte brightnessLow = 1; // Low brightness value
  const byte brightnessHigh = 50; // High brightness value
  int sensorValue = analogRead(sensorPin); // Read sensor
  Serial.print("Sensor is: ");Serial.println(sensorValue);
  sensorValue = map(sensorValue, 0, 255, 1, 100);
  LEDS.setBrightness(sensorValue);
  };
вот такими строчками:
C:
void BrightnessCheck() {

  if (auto_bright) {                         // если включена адаптивная яркость
    if (millis() - bright_timer > 100) {     // каждые 100 мс
      bright_timer = millis();               // сброить таймер
      new_bright = map(analogRead(BRI_PIN), 0, bright_constant, min_bright, max_bright);   // считать показания с фоторезистора, перевести диапазон
      new_bright = constrain(new_bright, min_bright, max_bright);
      new_bright_f = new_bright_f * coef + new_bright * (1 - coef);
      LEDS.setBrightness(new_bright_f);      // установить новую яркость
    }
  }
};

Тут стоит упомянуть что программистом я не являюсь и большинство проблем я пытаюсь решить методом тыка и перебора.

И тут все заработало, моей радости не было придела, пока не наступила ночь. Появилась проблема с отключением ленты при полной темноте. Иногда это было только на минуту, а иногда на целую ночь. Еще есть проблема со слабим мерцанием светодиодов если освещения в комнате было мало (например когда работал телик), но это было редко и длилось это одну минуту.

Что касается кода вот сылка на GitHub. Кое-что я перевел для лучшего понимания.

Давно хотел поделиться готовым и работоспособным проектом в кругах аудитории Алекса, но вышло так что собственно нормальной работоспособностью тут не пахнет. Буду благодарени, если у кто сможет помочь.
 
Изменено:

Комментарии

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
@kym13,
maksland
Посмотри схему в посте 431 практически одно и тоже только на ESP

@kym13, сам модуль можно запитывать от 5В. Датчики тоже можно, кроме некоторых, на которых указано что 3.3В.
@kym13, 100 означает 100мс, т.е. 10 раз в секунду)
Ты не понял, запитать то можно 5 вольтами но и выход с датчика тоже будет 5 в, а в ESP вся логика работает на 3,3в, можно сжечь плату.
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
ASM в скетче забил функцию компенсации температуры
громко сказано) просто результат переменной можно изменить в любую сторону, также как и корректируется давление из ГПа в мм.рт.ст, обычным умножением или делением) врать не должны, датчики считаются точными, по крайней мере у меня совпадают с настенным и гигрометром)

  • Навел порядок в коде, добавил улучшений, вывел все настройки в одно место)
  • Сделал схему подключения в настройках)
  • Поставил ограничение по току, может пригодится)
  • Поставил яркость при запуске в 50.
  • Попытался сделать анимацию при старте, пока получилась статика, четыре черточки во время включения, пока идет соединение.
Спецы, помогите с простым вариантом анимацией, зажигаются по очереди, гаснут, и в цикле
C++:
/*Блокнотик
  +  задержка wifi при вкл эл-ва
  ?  загрузка при старте
  - MQTT
  - IoT
  + ограничение по току
*/
#include <ESP8266WiFi.h>
#include <EasyNTPClient.h>
#include <WiFiUdp.h>
#include <RTClib.h>
RTC_DS3231 rtc;
#include <FastLED.h>
#include <BMP280_DEV.h>
BMP280_DEV bmp280;
#include <OneWire.h>
#include <DallasTemperature.h>
WiFiUDP udp;

/////////////////////НАСТРОЙКИ И СХЕМА//////////////////
//питание платы от БП не выше 5В
//DS3231 SDA=>D2 SCL+>D1 питание с 5В БП или с 3.3В
//BMP/BME 280 SDA=>D2 SCL+>D1 питание 3.3В
//DS18B20 питание 5В, если уличный без модуля ставим резистор между питанием и сигнальным на 4.7К
const char *ssid = "";        //имя WiFi сети вашего роутера
const char *password = "";    //пароль от сети
#define ONE_WIRE_BUS_2 D5     //PIN датчика ds18b20
int UpdatePeriod = 12;        //период в часах, как часто обновлять время из интернета, лучше не пишите маленькие числа:)
#define LEDS_IN_SEGMENT 4     // задаём сколько у нас светодиодов в сегменте
#define DOTS_NUM 2            // задаём сколько у нас разделительных точек
#define NUM_COLORS 16         // количество цветов, записаны в ColorTable
#define COLOR_CHANGE 0        // смена цвета ( 0 - никогда, 1 - раз в минуту, 2 - каждые десять минут, 3 - каждый час, 4 - каждые десять часов)
//если в схеме один фоторезистор не модулем, то вешаем резистор от 1К до 10К. Если у вас высокая освещенность, то 1К, если слабая, то до 10К
//один вывод фоторезистора на пин A0, или любой другой, второй на GND. Между GND и питанием ставим резистор
#define BRI_PIN A0            // PIN фоторезистора
#define max_bright 255        // максимальная яркость (0 - 255)
#define min_bright 10         // минимальная яркость (0 - 255)
#define bright_constant 1023  // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.4              // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
#define auto_bright 1         // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
EasyNTPClient ntpClient(udp, "pool.ntp.org", (3 * 60 * 60)); //заменить первую цифру на свой часовой пояс, 3 для МСК
#define COLOR_ORDER GRB       // тип ленты, поменять порядок GRB на свой тип, если неправильные цвета
#define LED_PIN 6             // PIN дата от ленты, подключать через резистор 330Ом
int brg = 10000;              // как часто проверять изменение по датчику освещенности в мс, 10000 соответствуют 10сек
byte type_brg = 0;            // выбрать тип датчика, 0 - аналог, 1 - цифровой
byte cnctd = 20;              // кол-во попыток подключиться к роутеру, две попытки в сек.
uint32_t milliamps = 1000;    // ограничение по току в мА
/////////////////////КОНЕЦ НАСТРОЕК/////////////////

// настроим библиотеку 1-Wire для связи с датчиком
OneWire oneWire_out(ONE_WIRE_BUS_2);
// создадим объект для работы с библиотекой DallasTemperature
DallasTemperature sensors(&oneWire_out); //уличный ds18b20
int Period = UpdatePeriod * 3600; //вычисление секунд
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM) // вычисляем кол-во светодиодов
/////////////////////////////////////////////
CRGB leds[NUM_LEDS];  // определение СД ленты
uint8_t  digits[] = { // определяем символы для отображения
  // код начинается с 0b0, далее идут 7 цифр, каждая цифра это номер фрагмента, 1 - включен, 0- отключен
  // далее указан получающийся символ и порядковый номер в массиве
  0b00111111,     // Символ 0          0
  0b00100001,     // Символ 1          1
  0b01110110,     // Символ 2          2
  0b01110011,     // Символ 3          3
  0b01101001,     // Символ 4          4
  0b01011011,     // Символ 5          5
  0b01011111,     // Символ 6          6
  0b00110001,     // Символ 7          7
  0b01111111,     // Символ 8          8
  0b01111011,     // Символ 9          9
  0b01111000,     // Символ * градус  10
  0b00011110,     // Символ C         11
  0b00000000,     // Без символа      12
  0b01000000      // Символ -         13
};
bool Dot = true;    // переменная для точек
int last_digit = 0; // последний символ равен нулю
byte set_light;     // переменная для освещенности
byte brightness;    // переменная для освещенности
int new_bright, new_bright_f; // переменная для освещенности
unsigned long bright_timer, off_timer; // переменная для освещенности
float temperature, pressure, altitude;
CRGB ledColor = CRGB::Blue;   // цвет в hex
CRGB ColorTable[NUM_COLORS] = { // Таблица цветов
  CRGB::Amethyst,
  CRGB::Aqua,
  CRGB::Blue,
  CRGB::Chartreuse,
  CRGB::DarkGreen,
  CRGB::DarkMagenta,
  CRGB::DarkOrange,
  CRGB::DeepPink,
  CRGB::Fuchsia,
  CRGB::Gold,
  CRGB::GreenYellow,
  CRGB::LightCoral,
  CRGB::Tomato,
  CRGB::Salmon,
  CRGB::Red,
  CRGB::Orchid
};
/////////////////////////////////////////////
void setup() {
  Serial.begin(115200);
  Wire.begin();
  LEDS.setBrightness(50);
  FastLED.addLeds<WS2812B, LED_PIN, RGB>(leds, NUM_LEDS); // подключение ленты
  FastLED.setMaxPowerInVoltsAndMilliamps (5, milliamps);
  bmp280.begin(BMP280_I2C_ALT_ADDR);
  bmp280.setTimeStandby(TIME_STANDBY_2000MS);
  bmp280.startNormalConversion();
  if (!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
  /*
    if (!bmp.begin()) {                               // Проверка инициализации датчика
    Serial.println("Could not find a valid BME280 sensor, check wiring!"); // Печать, об ошибки инициализации.
    while (1);                                          // Зацикливаем
    }*/
  syncTime();

}
/////////////////////////////////////////////
void BrightnessCheck() { // функция освещенности
  static uint32_t last_br = millis();
  if ((millis() - last_br) < brg) return;
  last_br = millis();
  if (auto_bright) {                         // если включена адаптивная яркость
    if (millis() - bright_timer > 100) {     // каждые 100 мс
      bright_timer = millis();               // сбросить таймер
      switch (type_brg) {
        case 1:
          new_bright = map(digitalRead(BRI_PIN), 0, bright_constant, max_bright, min_bright);   // считать показания с фоторезистора, перевести диапазон
          break;
        default:
          new_bright = map(analogRead(BRI_PIN), 0, bright_constant, max_bright, min_bright);   // считать показания с фоторезистора, перевести диапазон
      }
      Serial.println((String)"Освещенность: " + new_bright);
      new_bright = constrain(new_bright, min_bright, max_bright);
      new_bright_f = new_bright_f * coef + new_bright * (1 - coef);
      LEDS.setBrightness(new_bright_f);      // установить новую яркость
    }
  }
};
/////////////////////////////////////////////
void syncTime() {
  WiFi.begin(ssid, password);
  byte trys = 0;
  Serial.println("");
  while (WiFi.status() != WL_CONNECTED) {
    trys++;
    //    delay(500);
    NoSignal();
    Serial.print(".");
    if (trys > cnctd)
    {
      Serial.println("Нет связи с роутером!");
      return;
    }
  }
  long ntpTime = ntpClient.getUnixTime();
  if (ntpTime > 1609459200) {
    rtc.adjust(DateTime(ntpTime));
    Serial.println("");
    Serial.println("Время записано!");
  }
  else
  {
    Serial.println("");
    Serial.println("Отказ в записи! Время получено неправильное!");
    GetTime();
  }
  // Выключаем WIFI после обновления
  WiFi.disconnect();
  WiFi.mode(WIFI_OFF);
  WiFi.forceSleepBegin();
  delay(1000);
}
/////////////////////////////////////////////
int GetTime() {
  DateTime now = rtc.now();
  int hour = now.hour();
  int minute = now.minute();
  int second = now.second();
  Serial.println((String)hour + ":" + minute + ":" + second);
  Dot = second % 2; // точки мигают раз в сек
  return (hour * 100 + minute);
};
/////////////////////////////////////////////
void TimeToArray() { // вывод времени на экран
  int Now = GetTime(); // получаем время
  boolean Dots = true; // точки
  if (Dot == 0) Dots = false; else Dots = true;
  if (Dots) { // показ точек
    for (uint8_t i = 0; i < DOTS_NUM; i++) {
      leds[(LEDS_IN_SEGMENT * 14) + i] = ledColor;
    }
  }
  else {
    Dots_off(); // выключение точек
  }
  for (int i = 1; i <= 4; i++) { // 4 сегмента
    int digit = Now % 10; // получаем последнюю цифру в времени
    int cursor = NUM_LEDS - i * LEDS_IN_SEGMENT * 7;
    if (i > 2) {
      cursor -= DOTS_NUM;
    }
    if ( i == 4 & digit == 0)Digit(digits[12], cursor); // если впереди ноль, то выключаем его, например 01:23 будет как 1:23
    else
      Digit(digits[digit], cursor);                     // иначе показываем символ

    if ( i == COLOR_CHANGE) {                           // как часто менять цвет
      if (digit != last_digit) {
        ledColor =  ColorTable[random(NUM_COLORS)];     // случайный цвет из таблицы
      }
      last_digit = digit;
    }
    Now /= 10;
  };
};
/////////////////////////////////////////////
void Dots_off()  { // отключаем точки принудительно, где не нужны
  for (uint8_t i = 0; i < DOTS_NUM; i++) {
    leds[(LEDS_IN_SEGMENT * 14) + i] = 0x000000;
  }
}
/////////////////////////////////////////////
void Digit (uint8_t digit, uint8_t cursor) { // функция отображения символов
  for (uint8_t mask = 0b01000000; mask > 0; mask = mask >> 1) {
    for (uint8_t i = 0; i < LEDS_IN_SEGMENT; i++) {
      leds[cursor] = (digit & mask) ? ledColor : CRGB (0, 0, 0);
      cursor ++;
    }
  }
}
/////////////////////////////////////////////
void TempToArray() { // вывод температуры с датчика BMP280 на экран
  bmp280.getMeasurements(temperature, pressure, altitude);
  int celsius = temperature; //датчик на стене, выше роста, корректировка минус 1 градус, сейчас на столе стенд

  Serial.println ((String) celsius + " | " + temperature);
  Dots_off(); // выключаем точки
  Digit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); // символ градуса

  int digit = abs (celsius % 10);
  Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));

  digit = celsius / 10;
  if (digit == 0)Digit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); // если впереди ноль, то выключаем его
  else
    Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); // иначе показываем как есть

  Digit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); // отключаем 1 сегмент
};
/////////////////////////////////////////////
void PressToArray() { // вывод давления на экран
  bmp280.getMeasurements(temperature, pressure, altitude);
  int davlenie = pressure * 0.75;
  Serial.println ((String) davlenie + " | " + pressure * 0.75);

  Dots_off(); // выключаем точки

  int digit = davlenie % 10;
  Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7));

  digit = davlenie % 100 / 10;
  Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));

  digit = davlenie / 100;
  Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));

  Digit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); // отключаем первый сегмент
};
/////////////////////////////////////////////
void TempStreetToArray() { // вывод уличной температуры на экран
  sensors.requestTemperatures(); // опрос датчика уличной температуры
  int celsius = sensors.getTempCByIndex(0); // чтение уличной температуры
  Serial.println ((String) celsius + " | " + sensors.getTempCByIndex(0));

  Dots_off(); // выключаем точки

  Digit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); // символ градуса

  int digit = abs (celsius % 10);
  Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));

  digit = abs (celsius / 10);
  if (digit == 0)Digit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); // если впереди ноль, то выключаем его
  else
    Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); // иначе показываем как есть

  if (sensors.getTempCByIndex(0) <= -1)Digit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); // если < или = -1, то показываем -
  else
    Digit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); // иначе выключаем 1 сегмент
};
/////////////////////////////////////////////
void Asm() { //мой образец вывода
  static bool TempShow = true; // флаг для температуры в помещении
  static bool TempSShow = true; // флаг для температуры на улице
  static bool PressShow = true; // флаг для давления
  uint32_t tmrall = millis() % 12000 / 1000; //берем интервал в 12сек
  static uint32_t tmrall_old = 10000;        //в расчет берутся 10сек, в исключение 2 сек, ниже будет понятно:)
  if (tmrall_old != tmrall)
  {
    tmrall_old = tmrall;
    if (tmrall < 6) //6 сек показывают часы
    {
      TimeToArray();
      TempShow = true;
      TempSShow = true;
      PressShow = true;
    }
    else if (tmrall < 8) //2 секунды показывается температура, добавляем +2
    {
      if (TempShow)
      {
        TempToArray();
        TempShow = false;
      }
    }
    else if (tmrall < 10) //2 секунды показывается температура, добавляем +2
    {
      if (TempSShow)
      {
        TempStreetToArray();
        TempSShow = false;
      }
    }
    else
    {
      if (PressShow) // остальное время показывается давление
      {
        PressToArray();
        PressShow = false;
      }
    }
    FastLED.show(); // команда для включения светодиодов
  };
}
/////////////////////////////////////////////
void loop() {
  BrightnessCheck();
  if (millis() % 1000 < Period - 1)
  {
    Asm();
    //kym13();
  }
  else {
    syncTime();
  }
}
/////////////////////////////////////////////
void kym13() {
  static bool TempSShow = true; // флаг для температуры на улице
  uint32_t tmrall = millis() % 60000 / 1000;
  static uint32_t tmrall_old = 46000;
  if (tmrall_old != tmrall)
  {
    tmrall_old = tmrall;
    if (tmrall < 46) //46 сек показывают часы
    {
      TimeToArray();
      TempSShow = true;
    }
    else
    {
      if (TempSShow) // остальное время показывается давление
      {
        TempStreetToArray();
        TempSShow = false;
      }
    }
    FastLED.show(); // команда для включения светодиодов
  };
}
/////////////////////////////////////////////

void NoSignal() {
  Digit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 7));
  delay(125);
  Digit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 14));
  delay(125);
  Digit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));
  delay(125);
  Digit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));
  delay(125);
  FastLED.show(); // команда для включения светодиодов
}
 
Изменено:
  • Лойс +1
Реакции: kym13

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
Вот скетч с одной точкой в дате, 2 LED на сегмент
Повторил #482
Clock1_s_1_point_v_date.ino
но на ws2811. За бортом BME280 (температура, влажность на улице + давление), в помещении температура с DS3231.
Все получилось, спасибо всем кто помогал.
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@razwal, если немного переделать, то да) bme у меня нет, не протестировать) bmp есть, и то еле подобрал библиотеку)
 

razwal

✩✩✩✩✩✩✩
20 Янв 2020
22
3
@razwal, если немного переделать, то да) bme у меня нет, не протестировать) bmp есть, и то еле подобрал библиотеку)
Ну у меня как раз полно датчиков BME280 ( ну в принципе уже нашел в местном магазине и BMP , всего 150 руб.) .
Ещё вопрос - мне нужно отображать только часы , температуру с внешнего датчика и давление , я так понимаю для этого нужно закоментить 299 строку или просто в ней написать вместо true - false ? ( в программирование почти ноль ) .А может еще закоментить с 314 по 321 ?. И что ещё изменить , чтобы 6 секунд отображались часы и по две секунды температура и давление ? (наверное в 302 строке изменить 12000 на 10000 и в 303 10000 на 8000 ) .
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@razwal, вроде так)
C++:
void razwal() {
  static bool TempSShow = true; // флаг для температуры на улице
  static bool PressShow = true; // флаг для давления
  uint32_t tmrall = millis() % 10000 / 1000;
  static uint32_t tmrall_old = 8000;       
  if (tmrall_old != tmrall)
  {
    tmrall_old = tmrall;
    if (tmrall < 6) //6 сек показывают часы
    {
      TimeToArray();
      TempSShow = true;
      PressShow = true;
    }
     else if (tmrall < 10) //2 секунды показывается уличная температура, добавляем +2
    {
      if (TempSShow)
      {
        TempStreetToArray();
        TempSShow = false;
      }
    }
    else
    {
      if (PressShow) // остальное время показывается давление
      {
        PressToArray();
        PressShow = false;
      }
    }
    FastLED.show(); // команда для включения светодиодов
  };
}
 

razwal

✩✩✩✩✩✩✩
20 Янв 2020
22
3
ASM , спасибо , буду пробовать . Ну и вопрос на будущее - не планируете сделать вывод часов , температуры и давления разным цветом ?
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@razwal, не думал, а надо ли?) думаю можно принудительно добавить в нужные места нужный цвет, сложности не должно быть)
 

razwal

✩✩✩✩✩✩✩
20 Янв 2020
22
3
@razwal, не думал, а надо ли?) думаю можно принудительно добавить в нужные места нужный цвет, сложности не должно быть)
Да , может и не надо , просто у меня маленькие часы собраны на TM1637 и двух семи-сегментных дисплеях на MAX7219( для температуры , давления и даты ) , так в них у меня всё сделано разным цветом (MAX7219 с панельками под индикатор) .Смотрится довольно не плохо. (правда все делал в программе FLPROG , в ней нужен минимум знаний программирования ) .
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
Сделал анимацию загрузки при старте) классно выглядит)
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,253
1,297
Москва
Поверить не поверить не причем. Посмотреть то хочется, а собирать я себе не буду, мне пока без надобности. Любопытно жеж!
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@maksland, думаю нет, только мешаться будет. Можешь попробовать)
 

maksland

★★★✩✩✩✩
13 Янв 2019
513
117
Omsk
у меня в версии часов на PIC приделана, не мешает... хотя может лучше было если она стояла после показаний
 
  • Лойс +1
Реакции: начинающий

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
Вот так выглядит проект на народном мониторинге, адрес левый)

Допилил я IoT на народный мониторинг, завтра надо будет инструкцию стряпать)
Есть желание организовать протокол MQTT чтобы можно командами выполнять какие-то действия.
Команды можно привязать к Алисе и просить ее выполнить команду)
Например, обнови время) Какая температура дома, давление, температура на улице) Какие еще команды можно спросить?)
IMG_20210321_233941.jpg
 
Изменено:

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
Создал отдельную тему по ESP, заходите ))
На случай возникновения вопросов по теме часов на ардуино, эта ветка останется живой? можно ли будет сюда писАть, или ветка закрывается в связи с изменением и переездом на другую тему?
 

maksland

★★★✩✩✩✩
13 Янв 2019
513
117
Omsk
по ардуино продолжаем конечно , датчик давления еще прикрутить надо и температуру "раскрасить"
скоро платы приедут (с двумя датчиками ds18b20)
 

начинающий

✩✩✩✩✩✩✩
13 Дек 2020
130
9
...датчик давления еще прикрутить надо и температуру "раскрасить"
датчик давления вроде прикручен уже в #482, по поводу раскраски температуры на соседнем форуме (arduino.ru) в теме "Большие настенные часы на Arduino" в последних сообщениях появился новый скетч с раскраской температуры: http://arduino.ru/forum/programmirovanie/bolshie-nastennye-chasy-na-arduino?page=15 см пост #787. Кто возьмется раскрасить температуру, на основе приведенного примера? Еще есть предложения кроме красного и синего цветов применить градиентные оттенки для промежуточных значений температур, например: для диапазона от -45 до +45 градусов распределить шкалу цветов от фиолетового до темно красного, где фиолетовый соответствовал бы крайней отрицательной температуре (-45), а темно красный соотв крайне максимальной положительной температуре (+45), желтый к примеру в районе +20градусов, оранжевый - +30, белый - 0, голубой -10.... и т.д.
 
Изменено:
  • Лойс +1
Реакции: maksland