Большие часы на адресных светодиодах 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. Кое-что я перевел для лучшего понимания.

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

Комментарии

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
Вот этот урок Гайвера не читал?
читал, как ранее описывал, каша какая-то с этими миллисами, много лишнего) задержка намного проще и понятнее, но она плохо влияет на код)
ну так и мы же тебе все время подсказываем, разве нет ?
подсказываете, я не спорю, лайкаю даже, но уж такие мелкие точности доступны знающему, а не миллис вычесть старый миллис, сравнить период, каша же)
так ты теперь всю жизнь и будешь эти часы делать
нет уж, сейчас доделываю, если заработает как надо, надо будет внести условия, в этих библиотеках они хоть есть, в отличии от простеньких в прошлых версиях, где оптимизировали память, и можно разбираться уже интересными вещами, типа MQTT, IoT, строить графики, есть идея внести предсказание погоды, реализацию представляю как сделать... Идей много, упиралось только запилить cкетч на ESP...
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
Вот первая beta версия на BMP280 и DS18B20
Кто может, проверяйте, пишите замечания, предложения, я позже проверю, надо перепаивать с ардуинки, а пока отдохнуть)

C++:
#include <ESP8266WiFi.h>
#include <EasyNTPClient.h>
#include <WiFiUdp.h>
#include <RTClib.h>
RTC_DS3231 rtc;
#include <FastLED.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp(0x76);
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int UpdatePeriod = 12; //период в часах
int Period = UpdatePeriod * 3600; //вычисление секунд

const char *ssid = "";
const char *password = "";

WiFiUDP udp;
EasyNTPClient ntpClient(udp, "pool.ntp.org", (3 * 60 * 60));
/////////////////////////////////////////////
#define LEDS_IN_SEGMENT 4     // задаём сколько у нас светодиодов в сегменте
#define DOTS_NUM 2            // задаём сколько у нас разделительных точек
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM) // вычисляем кол-во светодиодов
#define NUM_COLORS 16         // количество цветов
#define COLOR_CHANGE 0        // смена цвета ( 0 - никогда, 1 - раз в минуту, 2 - каждые десять минут, 3 - каждый час, 4 - каждые десять часов)
#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 - выключить)
/////////////////////////////////////////////
#define COLOR_ORDER GRB  // тип ленты
#define LED_PIN 6  // пин дата от ленты
#define BRI_PIN A0 // PIN фоторезистора
/////////////////////////////////////////////
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; // переменная для освещенности
/////////////////////////////////////////////
//управление цветом
//int ledColor = 0x00FFFF;    // цвет в hex
//long ledColor = CRGB::Blue; // цвет в hex
CRGB ledColor = CRGB::Blue;   // цвет в hex
// массив цветов, для рандом при включенном режиме cylon(); ledColor =  ColorTable[random(16)];
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);
  if (!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
  /*
    if (!bmp.begin()) {
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
    while (1);
  }*/
  bmp.begin();
  sensors.begin();
  Serial.println("Обновление");
  syncTime();

  FastLED.addLeds<WS2812B, LED_PIN, RGB>(leds, NUM_LEDS); // подключение ленты

}

void syncTime() {
  WiFi.begin(ssid, password);
  byte trys = 0;
  while (WiFi.status() != WL_CONNECTED) {
    trys++;
    delay(500);
    Serial.print(".");
    if (trys > 10)
    {
      Serial.println("Нет связи с сервером!");
      return;
    }
  }
  long ntpTime = ntpClient.getUnixTime();
  if (ntpTime > 1609459200) {
    rtc.adjust(DateTime(ntpTime));
    Serial.println("Обновление...");
    // Выключаем WIFI после обновления
    WiFi.disconnect();
    WiFi.mode(WIFI_OFF);
    WiFi.forceSleepBegin();
    delay(1000);
  }
  else
  {
    Serial.print("Error Date");
    GetTime();
  }
}
int GetTime() {
  DateTime now = rtc.now();
  int hour = now.hour();
  int minute = now.minute();
  int second = now.second();
  Serial.print(hour);   Serial.print(":");  // вывод часов
  Serial.print(minute); Serial.print(":");  // вывод минут
  Serial.print(second); Serial.println(""); // вывод секунд
  Dot = second % 2; // точки мигают раз в сек
  return (hour * 100 + minute);
};
/////////////////////////////////////////////
void BrightnessCheck() { // функция освещенности
  static uint32_t last_br = millis();
  if ((millis() - last_br) < 10000) return;
  last_br = millis();
  if (auto_bright) {                         // если включена адаптивная яркость
    if (millis() - bright_timer > 100) {     // каждые 100 мс
      bright_timer = millis();               // сбросить таймер
      new_bright = map(analogRead(BRI_PIN), 0, bright_constant, max_bright, min_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 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 TempStreetToArray() { // вывод уличной температуры на экран
  sensors.requestTemperatures(); // опрос датчика уличной температуры
  int celsius = sensors.getTempCByIndex(0); // чтение уличной температуры
  Serial.println (celsius);

  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 TempToArray() { // вывод температуры с датчика BMP280 на экран
  bmp.begin();
  int celsius = bmp.readTemperature() - 1; // считываем датчик, датчик за часами, часы на стене, там температура чуть выше, корректировка минус 1
  Serial.println (celsius);

  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() { // вывод давления на экран
  bmp.begin();
  int davlenie = bmp.readPressure();
  Serial.println (davlenie);

  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 loop() {
  BrightnessCheck();
  if (millis() % 1000 < Period - 1)
  {
    body();
  }
  else {
    syncTime();
  }
}
/////////////////////////////////////////////
void body() {
  static bool TempShow = true; // флаг для температуры в помещении
  static bool TempSShow = true; // флаг для температуры на улице
  static bool PressShow = true; // флаг для давления
  uint32_t tmrall = millis() % 12000 / 1000;
  static uint32_t tmrall_old = 10000;
  if (tmrall_old != tmrall)
  {
    tmrall_old = tmrall;
    if (tmrall < 6)
    {
      TimeToArray();
      TempShow = true;
      TempSShow = true;
      PressShow = true;
    }
    else if (tmrall < 8)
    {
      if (TempShow)
      {
        TempToArray();
        TempShow = false;
      }
    }
    else if (tmrall < 10)
    {
      if (TempSShow)
      {
        TempStreetToArray();
        TempSShow = false;
      }
    }
    else
    {
      if (PressShow)
      {
        PressToArray();
        PressShow = false;
      }
    }
    FastLED.show(); // команда для включения светодиодов
  };
}
 

bort707

★★★★★★✩
21 Сен 2020
3,046
909
миллис вычесть старый миллис, сравнить период, каша же)
поверь моему опыту, эта каша на порядок правильнее того, что придумал ты например в сообщении #565

на самом деле, никакой каши нет. надо один раз вникнуть. Все. что требуется - засечь время предыдущего запроса на NTP сервер и выдержать с этого времени нужный период. Логичнее не бывает.
Вот смотри, условие
if ((millis() - prev_ntp_request_time) > 4 * HOURS)

Смотри, если millis() - это значение миллис сейчас, а prev_ntp_request_time - значение миллис в момент, когда мы запрашивали сервер в прошлый раз., значит величина (millis() - prev_ntp_request_time) - это время, прошедшее с прошлого запроса. И все что нужно сделать - сравнить его с нашим периодом, в моем случае 4 часа. Вот и все, что тут сложного?
 

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

★★★★★★★
14 Авг 2019
4,253
1,297
Москва
На самом деле нужно оперировать не одной паузой. Нужно иметь 2 шт:
1) периодичность запроса к NTP, для ASM это вроде 12 часов.
2) повтор после неудачной попытки. Можно сделать 5 минут например.

Опять же.. с ростом неудачных попыток время обновления будет смещаться. оно нам надо ? Тогда можно делать по другому, задать Час в котором надо делать обновление. к примеру 0 или 12 часов. (тут можно взять тот же остаток от деления 24 на 12 + смещение, если не надо 0 и 12)

Настало нужное время обновления ? нет, выставляем флаг на обновление, сидим дальше
Настало. Часы обновислись ? да - сидим дальше.
Нет. Прошло время повторного обновления (5 минут ) Нет. сидим дальше
Да. Обновляем,
запоминаем время последней попытки обновления.
обновилось ? нет, ну что поделать..
Да ставим флаг , что обновились,
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
Все. что требуется - засечь время предыдущего запроса на NTP сервер и выдержать с этого времени нужный период
как его засекать, чем?) записывать дату и время и сравнивать текущее время, если разница больше, то обновить и опять записать время, какие сложности. если есть миллис, который можно сравнить, не прошло ли 4 часа, если да, то обновить, ВСЕ!
 

bort707

★★★★★★✩
21 Сен 2020
3,046
909
а ты не замечаешь, что это
записывать дату и время и сравнивать текущее время, если разница больше, то обновить и опять записать время
и это
если есть миллис, который можно сравнить, не прошло ли 4 часа, если да, то обновить, ВСЕ!
- одно и тоже? :))
 

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

★★★★★★★
14 Авг 2019
4,253
1,297
Москва
static uint32_t vrema; // так можно объявить локальную переменную, которая будет хранить свое значение и после выхода из функции
...
vrema=millis() ; // вот тут засек время выполнения кода

я обычно если функуию надо выполнять не чаще какого то периода делаю так в начале фкнуции:

C++:
void SetLite_ON_OFF()
{
  static uint32_t tm = 0;
  if (millis() - tm < TEST_LT_PER) return;
  tm = millis();

//тут сама функция
 
}
 
  • Лойс +1
Реакции: bort707

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
повтор после неудачной попытки. Можно сделать 5 минут например.
я об этом думал, но смысл?) у нас же не космическая промышленность, обновится позже, можно интервал сделать реже, хоть 4 часа...
Час в котором надо делать обновление
тоже думал об этом, обновить например ночью, в 2 часа, минимальная нагрузка в сети)
Настало нужное время...
думаю лишнее это все) интернет есть всегда, rtc в комплекте, если что поживет на них, за месяц
расхождение пусть будет 2 минуты, так за месяц в любом случае законнектится к серверу)
в моем не надо записывать время коннекта, а просто сравнить)
 

bort707

★★★★★★✩
21 Сен 2020
3,046
909
На самом деле нужно оперировать не одной паузой. Нужно иметь 2 шт:
1) периодичность запроса к NTP, для ASM это вроде 12 часов.
2) повтор после неудачной попытки. Можно сделать 5 минут например.
возможных алгоритмов много
Если вспомнить, что у нас еще есть интервал запроса времени с RTC...
Скажем, запрашиваем время с RTC раз в минуту. Каждый 240 запрос времени(4 часа) делаем вместо RTC запрос в NTP. Если запрос в NTP неудачный - счетчик не сбрасываем и автоматически получается, что пока запрос в NTP не вернет время - он будет выполнятся раз в минуту. Как запрос удачен - счетчик сбросили и следующий запрос через 4 часа
 

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

★★★★★★★
14 Авг 2019
4,253
1,297
Москва
Вот смотри .. рассматриваю для байт! т.е. число от 0 до 255
время последнего 5
Интервал ну пусть будет 10
допустим текущее время 7
5+10 больше 7, значит выполнять не надо
стало время 20
5+10 меньше 20, значит надо выполнить и запомнить время последнего выполнения - 20.

Вроде бы все ок, но пока не подойдет время к 255

Время последнего выполнения пусть будет 248
текущее время 250
248+10 будет 258 , и вроде бы больше 250 Но! т.е. это байт
то будет не 258, а 3! И 3 меньше 248 и будет еще одно выполнени.

А теперь если пройтись по классической схеме и брать интервал
7-5=2, 2 меньше 10 , вполнять не надо
255 - 250=5, 5 меньше 10 , выполнять не надо
тут время прешело через 255 и стало 0,1,2...5!
5- 253=-248, но такого быть не может и будет 7!
7 меньше 10 и выполнять не надо.
Тут не трудно понять , что разность между 5 и 253 в абсолютном виде и есть 7 единиц.
 

bort707

★★★★★★✩
21 Сен 2020
3,046
909
в моем не надо записывать время коннекта, а просто сравнить)
вот ты спрашиваешь, почему я не пишу с тобой этот код? - ты думаешь, ты один , кто в программировании понимает чуть, но при этом лезет спорить? - каждый второй новичок такой...
Поэтому я участвую только в тех проектах, которые интересны лично мне. А в остальных, ребята, рулите сами. Если у вас есть проблемы - могу подсказать, но если вы предпочитаете писать кривой код, который потом будет постоянно глючить - да пишите, мне-то что ? :)
Поэтому в этом коде столько кривизны, потому что каждый новичок добавляет что-то от себя. Одному нужен BME датчик, другому BMP, третьему - переписать код на ЕСП. А поскольку большинство из вас, повторюсь, в предмете не фурычит - в итоге из исходного кода получается винигрет. И что ты предлагаешь, после каждого такого "писателя" нам с Похабычем ваш код переписывать? - нет, раз уж взялись - делайте сами
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
Если у вас есть проблемы - могу подсказать, но если вы предпочитаете писать кривой код, который потом будет постоянно глючить - да пишите, мне-то что ?
Гайвер же пишет, а потом народ мучается, исправляет ошибки)
А поскольку большинство из вас, повторюсь, в предмете не фурычит
так этот форум и создан для нас, где этим занимаемся, и есть хоть какая-то активность, если подскажешь что-то более лучшее, где энтузиастов больше, буду рад присоединиться)

Ответ китайца по bme280
The chip of this product is out of stock in China, and the market supply of goods is insufficient
 
Изменено:

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
@ASM, попробовал beta версия
[/
1:43:27.425 -> -1
11:43:29.427 -> -127
11:43:31.425 -> 0
11:43:33.427 -> 8:43:33
11:43:34.410 -> 8:43:34
11:43:35.429 -> 8:43:35
11:43:36.413 -> 8:43:36
11:43:37.428 -> 8:43:37
11:43:38.413 -> 8:43:38
11:43:39.432 -> -1
11:43:41.436 -> -127
11:43:43.416 -> 0
11:43:45.418 -> 8:43:45
11:43:46.402 -> 8:43:46
11:43:47.424 -> 8:43:47
11:43:48.422 -> 8:43:48
11:43:49.406 -> 8:43:49
11:43:50.423 -> 8:43:50
11:43:51.408 -> -1
11:43:53.412 -> -127
11:43:55.412 -> 0

это у меня в мониторе порта, на дисплей ничего не выводит]
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@kym13, датчики не подключены, поэтому всё так. Сегодня постараюсь проверить на часах с датчиками) bme начинают дешеветь, вроде как, нашёл за 370р, ждём снижения)
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
@ASM, время то должно на индикаторы выводится и без датчиков. Дисплей вообще не светится. Раньше хоть типа этого высвечивалось 65:64
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@kym13, наладим) посмотри, выводятся ли символы в монитор, в функции с часами, что-то вроде Serial.print(digit)...
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
@ASM, выше я выложил всё что у меня отображается в мониторе
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@kym13, так я и предлагаю вручную проверить, если есть понимание и желание)
 

kym13

★★✩✩✩✩✩
14 Ноя 2020
472
70
@ASM, Желание есть понимания нет, я в программировании ноль.
 

Александр Злюс

✩✩✩✩✩✩✩
10 Фев 2020
19
1
Вот и я о том же подумал. Когда паял в принципе было без разницы какую точку первую подключать верхнюю или нижнюю. Вообще по схеме сначала первая подключается, ща у себя посмотрю, благо есть табло легко разбирающееся.

Да, слева на право верхняя точка первая.
ПРИВЕТ А МОЖНО ЛИ так подключить и как изменить тогда прошивку? . подключение с право на лево
 

Вложения

  • 6.2 KB Просмотры: 2

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@Александр Злюс, подключить можно как угодно, только переписать немного код надо будет) лучше делать стандартно, чтобы можно было легко менять прошивки)
 

Александр Злюс

✩✩✩✩✩✩✩
10 Фев 2020
19
1
@Александр Злюс, подключить можно как угодно, только переписать немного код надо будет) лучше делать стандартно, чтобы можно было легко менять прошивки)
,,,, мне бы пример прошивки на 30 светодиодов , если можно ))) корпус сделал и ошибся .
 

maksland

★★★✩✩✩✩
13 Янв 2019
513
117
Omsk
Да я про схему на esp и спрашиваю чтобы плату нарисовать , на atmega плата с двумя ds18b20 уже едет из Китая (с одним проверена в железе)