А что до того, "что для вычисления неизвестного, мы это самое неизвестное умножаем на коэфициент??" - так это очень просто. Значение new_bright_f, стоящее в правой стороне формулы - это прежнее значение яркости, а в левой (в результате) - это то значение, которое мы вычисляем. И смысл этой формулы очень прост - берем 90% прежней яркости. прибавляем 10% нового значения - и так на каждом круге loop. Таким образом при смене освещения у нас яркость диодов не "прыгает", а меняется плавно.
Их этого обьяснения, надеюсь, теперь понятно, что в формуле может быть только "плюс", а никак не минус.
В формуле, конечно, несколько странные имена переменных, которые сбивают с толку. Но это не ко мне, автор формулы не я :)
Здравствуйте! Решил себе поставить резистор на автояркость - не работает. Прикупил себе gy-30, но не понимаю к каким выводам его припаять, и нужно ли менять код? Подскажите пожалуйста.
И смысл этой формулы очень прост - берем 90% прежней яркости. прибавляем 10% нового значения - и так на каждом круге loop. Таким образом при смене освещения у нас яркость диодов не "прыгает", а меняется плавно.
Их этого обьяснения, надеюсь, теперь понятно, что в формуле может быть только "плюс", а никак не минус.
В формуле, конечно, несколько странные имена переменных, которые сбивают с толку. Но это не ко мне, автор формулы не я :)
Спасибо вам в который раз. Поправил всё. Часики работают. В ночи подсветка еле еле,и не засвечивает комнату.. Днём ярко
/*/Проект собран на основе желания сделать себе как у всех, но чуточку лучше. Основная работа по коду шла на
форуме <a href="http://arduino.ru." rel="nofollow">http://arduino.ru.</a> Конкретно началось с поста №58. Много людей помогали и вносили свою лепту
во всё это действо b707, bwn, GennOk.
Данный проект подходит под определение метео станция. Вывод данных о температуре, давлении и влажности. Так же основное
предназначение это показ часов. Очень много коментариев и росписей по кокретным блокам.
Проект универсальный, под разное количество LED-светодиодов, за это отдельное спасибо b707. Да и вообще большая часть кода
была переписана этим человеком. От того, что было изначально возможно осталась только идея))) Универсальность количества
диодов, переписана координатность символов, переназначение кнопок, отключение смены цветов либо смена по времени.
ВОЗМОЖНО в будущем появится вывод даты
////////////////////////////////////////////////////////////////////////////Arduino.ru)))
*/
#include <Adafruit_BME280.h>
#include <DS3232RTC.h>
#include <Time.h>
#include <FastLED.h>
#define LEDS_IN_SEGMENT 4 // Задаём сколько у нас светодиодов в сегменте.
#define DOTS_NUM 2 // Задаём количество разделительных точек
#define COLOR_CHANGE 3 // ( 0 - НИКОГДА, 1 - каждую минуту, 2 - каждые 10 минут, 3 - каждый час, 4 - каждые 10 часов)
#define NUM_COLORS 16 // цветовая гамма
#define COLOR_ORDER BGR // По умолчанию цвет стоит зелёный при выключенных режимах
#define DATA_PIN 13 // подключение ленты
#define BRI_PIN A0 // фоторезистор
#define auto_bright 1 // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define max_bright 255 // максимальная яркость (0 - 255)
#define min_bright 2 // минимальная яркость (0 - 255)
#define bright_constant 500 // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.8 // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;
Adafruit_BME280 bme; // BME280 давление, влажность, температура I2C
//BMP280 PINS //датчик подключается паралельно часам по I2C
//SCL -> SCL or A5
//SDA -> SDA or A4
// Вычислемые константы, НЕ РЕДАКТИРОВАТЬ!
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM) //114 количество светодиодов в ленте
//#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + 2) //114 количество светодиодов в ленте
//#define DOT1 (LEDS_IN_SEGMENT * 14) // координаты мигающих точек
//#define DOT2 (LEDS_IN_SEGMENT * 14 + 1) // координаты мигающих точек
CRGB leds[NUM_LEDS]; //Задаём значение светодиодов, какой символ из чего состоит
uint8_t digits[] = {
0b00111111, // Digit 0
0b00100001, // Digit 1
0b01110110, // Digit 2
0b01110011, // Digit 3
0b01101001, // Digit 4
0b01011011, // Digit 5
0b01011111, // Digit 6
0b00110001, // Digit 7
0b01111111, // Digit 8
0b01111011, // Digit 9
0b01111000, // Digit * градус 10
0b00011110, // Digit C 11
0b01111100, // Digit P 12
0b01111000, // Digit % знак % из двух частей 13
0b01000111, // Digit % знак % из двух частей 14
};
bool Dot = true;
bool DST = false;
bool TempShow = true;
bool PressureShow = true;
bool HumidityShow = true;
int last_digit = 0;
long ledColor = CRGB::DarkGreen; // Используемый цвет
//long ledColor = CRGB::MediumVioletRed;
long 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,
CRGB::DarkOrchid
};
void setup() {
Serial.begin(9600);
//Wire.begin();//Для BMP
LEDS.addLeds<WS2812, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);
bme.begin(); //bmp.begin(); //датчик температуры
//LEDS.setBrightness(75); // Задаём яркость
pinMode(4, INPUT_PULLUP); // Кнопка смены цветов
pinMode(3, INPUT_PULLUP); // Кнопка регулировки минут
pinMode(2, INPUT_PULLUP); // Кнопка регулировки часов
}
//новые координаты точек
void BrightDots (boolean Dot_On) {
for (uint8_t i = 0; i < DOTS_NUM; i++) {
leds[(LEDS_IN_SEGMENT * 14)+ i] = (Dot_On) ? ledColor : 0;
}
//leds[DOT2] = (Dot_On) ? ledColor : 0;
}
void BrightDigit (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 : 0;
cursor ++;
}
}
}
//Массив управляет яркостью
// Новый метод изменения яркости
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); // new_bright_f = new_bright_f * coef - new_bright * (1 - coef); // 300*0.9-300*(1-0.9)
// LEDS.setBrightness(new_bright_f); // установить новую яркость
LEDS.setBrightness(255-new_bright_f); // установить новую яркость
}
}
};
// Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 155 вместо 0155
int GetTime()
{
tmElements_t Now;
RTC.read(Now);
//time_t Now = RTC.Now(); // Получаем данные текущегO времени и его хранение
int hour = Now.Hour;
int minute = Now.Minute;
int second = Now.Second;
if (second % 2 == 0)
{
Dot = false;
}
else {
Dot = true;
};
return (hour * 100 + minute);
};
// Преобразуем время в массив для отображание
void TimeToArray() {
int Now = GetTime(); // Получаем время
BrightDots(Dot);
for (int i = 1; i <= 4; i++) {
int digit = Now % 10; // Получаем последнюю цифру в времениd
int cursor = NUM_LEDS - i * LEDS_IN_SEGMENT * 7;
if (i > 2) {
cursor -= DOTS_NUM;
//cursor -= 2;
}
BrightDigit(digits[digit], cursor);
if ( i == COLOR_CHANGE) {
if (digit != last_digit)
{
// cylon (); // цикличное изменение цветов
ledColor = ColorTable[random(NUM_COLORS)]; // цикличное изменение цветов
}
last_digit = digit;
}
Now /= 10;
};
};
// Функция вывода метеоданных
// Преобразуем Temp в массив для отображение
void TempToArray() {
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 25) { //через какое время показывать температуруi
TempShow = false;
return;
}
TempShow = true;
int t = bme.readTemperature(); //int t = bmp.readTemperature();
int celsius = t;
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); //65 начало знака Цельсия (*) 4й блокn
BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //44 начало знака Градус (С) 3 блок
int digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //21 2й блок вывода второго символа
celsius /= 10;
digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //0 1й блок вывода первого символаo
};
// Измеряем давление
void PressureToArray() {
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 30) {//через какое время показывать давление
PressureShow = false;
return;
}
PressureShow = true;
int p = bme.readPressure() / 133.322; //int p = bmp.readPressure() / 133.322;c
int Pressure = p;
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //0 начало знака Давления (Р) 1й блокh
// Pressure /= 10;
int digit = Pressure % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7 )); //65 4й блок вывода третьей цифры значения
Pressure /= 10;
digit = Pressure % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //44 3й блок вывода второй цифры значенияk
Pressure /= 10;
digit = Pressure % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM )); //21 2й блок вывода первой цифры значения
};
//Вывод влажности
//Переделано на BME280 //Пример на DHT11
void HumidityToArray() {
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 35) { //через какое время показывать влажность
HumidityShow = false;
return;
}
HumidityShow = true;
int h = bme.readHumidity(); //int h = dht.readHumidity();
int humidity = h;
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[14], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); //65 конец знака процентов (%) 4й блок
BrightDigit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //44 начало знака процентов (%) 3 блок
int digit = humidity % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //21 2й блок вывода второго символаA
humidity /= 10;
digit = humidity % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //0 1й блок вывода первого символа
};
//смена цвета ленты кнопкой DST Pin 4
void DSTcheck() {
int buttonDST = digitalRead(4);
if (buttonDST == LOW) {
ledColor = ColorTable[random(NUM_COLORS)];
};
delay(100);//время реакции на нажатие
};
// Массив управляет кнопками с часами и минутами
void TimeAdjust() {
int buttonH = digitalRead(2);
int buttonM = digitalRead(3);
if (buttonH == LOW || buttonM == LOW) {
delay(100);//время реакции на нажатие
tmElements_t Now;
RTC.read(Now);
int hour = Now.Hour;
int minutes = Now.Minute;
int second = Now.Second;
if (buttonH == LOW) {
if (Now.Hour == 23) {
Now.Hour = 0;
}
else {
Now.Hour += 1;
};
}
else
{
if (Now.Minute == 59) {
Now.Minute = 0;
}
else {
Now.Minute += 1;
};
};
RTC.write(Now);
}
}
//Меняем эффекты
void fadeall() {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i].nscale8(250);
}
}
// массив отвечает за цикличное изменение цветов
void cylon () {
static uint8_t hue = 0;
Serial.print("x");
// Сдвигаем один светодиод в любом направлении
for (int i = 0; i < NUM_LEDS; i++) {
// Устанавливаем 1 светодиод на цвет красный
leds[i] = CHSV(hue++, 255, 255);
// Показываем светодиоды
FastLED.show();
fadeall();
// Ждём немного и повторяем цикл
delay(10);
}
//Serial.print("x");
// Сдвигаем один светодиод в любом направлении
for (int i = (NUM_LEDS) - 1; i >= 0; i--) {
// Устанавливаем 1 светодиод на цвет красный
leds[i] = CHSV(hue++, 255, 255);
// Показываем светодиоды
FastLED.show();
fadeall();
// Ждём немного и повторяем цикл
delay(10);
}
}
void loop()
{
BrightnessCheck(); // Проверяем датчик освещения
DSTcheck(); // Проверяем цветовые режимы
TimeAdjust(); // Проверяем время если сменилось на 1 цифру
TimeToArray(); // Проверяем часы если сменилось на 1 цифру
TempToArray(); // температура
PressureToArray(); // давление
HumidityToArray(); // влажность
FastLED.show(); // Задаём массив светодиодов
if (TempShow == true) delay (5000); //время показа температуры
if (PressureShow == true) delay (5000);//время показа давления
if (HumidityShow == true) delay (5000);//время показа влажности
/*/
//вывод на монитор данных по освещённости
int brightness = analogRead(BRI_PIN);
// Получение тестовых значений
// Выодим на монитор полученное значение
Serial.print("brightness = "); // Название значения для наглядного представления
Serial.println(brightness); // Выводим значение и используем вызов println, те переноса строки
delay(1000);
*/
/*/
//вывод информации в монитор порта
// Раскоментировать если нужно посмотреть в сом порте, подтормаживает вся система если это открыто
Serial.print("Tемпература = ");
Serial.print(bme.readTemperature()); //Serial.print(bmp.readTemperature());
Serial.println("*C");
Serial.print ("Давление = ");
Serial.print (bme.readPressure() / 133.322); //Serial.print (bmp.readPressure() / 133.322); // Полученное значение в Па делим на 133,322 и получаем мм.рт.ст.
Serial.println (" mm"); // и соответственно меняем "Pa" на "mm"
Serial.print ("Влажность = ");
Serial.print (bme.readHumidity() ); // Serial.print (dht.readHumidity() ); //
Serial.println ("%\t"); //
Serial.println();
delay(8000);
Serial.println (" *Arduino.ru.* "); //
*/
}
Я уже предлагал такой вариант с меню и настройкой всего и вся под себя. довольно интересные часики. интересно на чем реализована вся логика на этих часиках, там деталей минимум (любимая нами 3231, неизвестный MCU типо нашей меги или STM, пассивный бузер, пара сенсорных кнопок и горсть 5050 да SMD мелочёвки). а функционал не плохой, настроек много как цвета так и времени с яруостью, даже какая то активация голосом есть, будильник имеется. вот что нибудь подобное и хочется иметь в наших народных часах.
не смог я пока осилить скетч из 303 поста в плане отрицательных температур, на просторах интернета нашел скетч на даласовском датчике покорчевал под свои потребности теперь минус светят (при отрицательных температурах) ,но меня смущает то что лента не используется в полной мере и светится только один цвет забитый при заливке скетча . Так вот просьба помочь допитлить чтоб как в 303 посте смену цвета можно было устанавливать 0,1,2,3 . Сам до такого не дорос прошу хелпануть :)
#include <DS3231RTC.h> // для работы с модулем часов реального времени
#include <Time.h> // для работы с модулем часов реального времени
#include <TimeLib.h> // для работы с модулем часов реального времени
#include <Wire.h> // для работы с модулем часов реального времени
#include "FastLED.h" // для работы с диодной ленты
#include <OneWire.h> // для работы с датчиком температуры
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
//DeviceAddress Thermometer1 = { 0x28, 0xEE, 0x28, 0x9F, 0x27, 0x16, 0x01, 0x6F }; // адрес 1го датчика DS18B20(у каждого датчика свой адрес)
DeviceAddress Thermometer2 ={ 0x28, 0x23, 0x8C, 0x22, 0x16, 0x13, 0x01, 0x10 }; // адрес 2го датчика DS18B20
#define NUM_LEDS 29 // количество диодов (полосок диодной ленты)
#define COLOR_ORDER BRG // порядок цветов в ленте
#define DATA_PIN 13 // пин вывода данных на диодную ленту
#define DS3232_I2C_ADDRESS 0x68
int val;
int c;
int dat;
//===================================================================================================
CRGB leds[NUM_LEDS]; // массив для задания цифр, 10 цифр по 7 сегметов
byte digits[10][7] = {{0,1,1,1,1,1,1}, // Digit 0
{0,1,0,0,0,0,1}, // Digit 1
{1,1,1,0,1,1,0}, // Digit 2
{1,1,1,0,0,1,1}, // Digit 3
{1,1,0,1,0,0,1}, // Digit 4
{1,0,1,1,0,1,1}, // Digit 5
{1,0,1,1,1,1,1}, // Digit 6
{0,1,1,0,0,0,1}, // Digit 7
{1,1,1,1,1,1,1}, // Digit 8
{1,1,1,1,0,1,1}}; // Digit 9 | 2D Array for numbers on 7 segment
//================================================================================================
int col;//переменная цвета
//=================================
bool Dot = true; ////объявление переменной состояния точки (разделение часы : минуты
int last_digit = 0;//long ledColor = CRGB::DarkOrchid; // Color used (in hex)
long ledColor = CRGB::Blue;// объявление переменной цвета диодной ленты
long ColorTable[16] = {
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};
//===================================================================================================
//int TP;
int TU;//объявление переменных для температуры
//===================================================================================================
void setup(){
sensors.begin();
//sensors.setResolution(Thermometer1, 10);
sensors.setResolution(Thermometer2, 10);
Serial.begin(9600);
Wire.begin();
LEDS.addLeds<WS2811, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // Set LED strip type
LEDS.setBrightness(255); // установка яркости ленты
pinMode(4, INPUT_PULLUP); // пин кнопки корректировки минут
pinMode(5, INPUT_PULLUP); // пин кнопки корректировки часов
pinMode(3,INPUT);//пин кнопки ручного управления яркостью дисплея
}
//===================================================================================================
int GetSecond(){ //функция запроса текущей секунды, результат в переменной "second"
tmElements_t Now;
RTC.read(Now);
//time_t Now = RTC.Now();// Getting the current Time and storing it into a DateTime object
int second =Now.Second;
// Serial.print(second);Serial.println("S");
return (second);
};
//===================================================================================================
int GetHour(){ //функция запроса текущего часа, результат в переменной "hour"
tmElements_t Now;
RTC.read(Now);
//time_t Now = RTC.Now();// Getting the current Time and storing it into a DateTime object
int hour =Now.Hour;
// Serial.print(second);Serial.println("S");
return (hour);
};
//===================================================================================================
int GetTime(){ //функция запроса текущего времени, результат в виде целого числа, то есть 10:25 будет 1025
tmElements_t Now;
RTC.read(Now);
//time_t Now = RTC.Now();// Getting the current Time and storing it into a DateTime object
int hour=Now.Hour;
int minutes=Now.Minute;
int second =Now.Second;
if (second % 2==0) {Dot = false;}
else {Dot = true;};
if(minutes%2==0)
{dat=0;}
else{dat=1;}
//Serial.print(minutes);
return (hour*100+minutes);
};
//===================================================================================================
int GetDate(){ //функция запроса текущей даты, результат в виде целого числа, то есть 25 января (01.25) будет 0125
tmElements_t Now;
RTC.read(Now);
//time_t Now = RTC.Now();// Getting the current Time and storing it into a DateTime object
int month=Now.Month;
int day=Now.Day;
{Dot = false;};
return (day*100+month);
}
//===================================================================================================
int GetYear(){ //функция запроса текущего года
tmElements_t Now;
RTC.read(Now);
//time_t Now = RTC.Now();// Getting the current Time and storing it into a DateTime object
int year=Now.Year;
{Dot = false;}
return (year+1970);
};
//===================================================================================================
void BrightnessCheck(){ // функция настройки яркости в соответствии с освещенностью
const byte sensorPin = 12; // пин датчика освещенности
const byte brightnessLow = 250; // низкий уровень яркости
const byte brightnessHigh = 250; // высокий уровень яркости
int last=0;
int yar;
int current=0;
int pos=0;
last=digitalRead(sensorPin);
if(last!=0)
{
delay(150);
current=digitalRead(sensorPin);
}
if(last!=0&¤t!=0)
delay(150);
pos=digitalRead(sensorPin);
if (last==1&¤t==1&&pos==1)
{yar=1;}//считывание показаний с датчика освещения с проверкой предыдущего состояния
else
{yar=0;}// светло
int buttonC = digitalRead(3);//пин с кнопки ручного переключения яркости
if(buttonC==HIGH&&c==0)
{
c=1;
}
if(buttonC==LOW&&c==1)
{
val=1;
}
if(buttonC==HIGH&&val==1)
{c=0;}
if(buttonC==LOW&&c==0)
{
val=0;
}
if (yar==0)
{val=0;c=0;}
if(val==1)
{LEDS.setBrightness(250);}//режим яркости ночной
else
{if (yar == 0)
{LEDS.setBrightness(brightnessHigh);}//режим яркости дневной
if (GetHour()>=18&&(yar == 1))
{LEDS.setBrightness(brightnessLow);}//режим яркости вечерний
if (GetHour()>=0&&GetHour()<=6&&(yar == 1))
{LEDS.setBrightness(250);}//режим яркости ночной
//Serial.println(current);
}
}
//===================================================================================================
CRGB convertT (int Now){ //функция преобразования любого числа в массив для отображения на ленте, результат - массив leds
int cursor = 29;
if (Dot){leds[14]=0x000000;}
else {leds[14]=0x000000;
};
for(int i=1;i<=4;i++){
int digit = Now %10; // get last digit in time
if (i==1){
//Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
cursor -=14;
for(int k=0; k<=6;k++){
// Serial.print(digits[digit][k]);
if (digits[digit][k]== 1){leds[cursor]=ledColor;}
if (digits[digit][k]==0){leds[cursor]=0x000000;};
cursor ++;
};
// Serial.println();
}
else if (i==2){
//Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
cursor =7;
for(int k=0; k<=6;k++){
// Serial.print(digits[digit][k]);
if (digits[digit][k]== 1){leds[cursor]=ledColor;}
else if (digits[digit][k]==0){leds[cursor]=0x000000;};
cursor ++;
};
// Serial.println();
}
else if (i==3){
//Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
cursor =22;
for(int k=0; k<=6;k++){
// Serial.print(digits[digit][k]);
if (digits[digit][k]== 1){leds[cursor]=0x000000;}
else if (digits[digit][k]==0){leds[cursor]=0x000000;};
cursor ++;
};
// Serial.println();
}
else if (i==4){
//Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
cursor =0;
for(int k=0; k<=6;k++){
// Serial.print(digits[digit][k]);
if (digits[digit][k]== 1){leds[cursor]=0x000000;}
if (digits[digit][k]==0){leds[cursor]=0x000000;};
cursor ++;
};
}
Now /= 10;
};
};
//====================================================================
CRGB convert (int Now){ //функция преобразования любого числа в массив для отображения на ленте, результат - массив leds
int cursor = 29;
if (Dot){leds[14]=ledColor;}
else {leds[14]=0x000000;
};
for(int i=1;i<=4;i++){
int digit = Now % 10; // get last digit in time
if (i==1){
// Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
cursor =22;
for(int k=0; k<=6;k++){
// Serial.print(digits[digit][k]);
if (digits[digit][k]== 1){leds[cursor]=ledColor;}
else if (digits[digit][k]==0){leds[cursor]=0x000000;};
cursor ++;
};
// Serial.println();
}
else if (i==2){
// Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
cursor -=14;
for(int k=0; k<=6;k++){
// Serial.print(digits[digit][k]);
if (digits[digit][k]== 1){leds[cursor]=ledColor;}
else if (digits[digit][k]==0){leds[cursor]=0x000000;};
cursor ++;
};
// Serial.println();
}
else if (i==3){
// Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
cursor =7;
for(int k=0; k<=6;k++){
// Serial.print(digits[digit][k]);
if (digits[digit][k]== 1){leds[cursor]=ledColor;}
else if (digits[digit][k]==0){leds[cursor]=0x000000;};
cursor ++;
};
// Serial.println();
}
else if (i==4){
// Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
cursor =0;
for(int k=0; k<=6;k++){
// Serial.print(digits[digit][k]);
if (digits[digit][k]== 1){leds[cursor]=ledColor;}
else if (digits[digit][k]==0){leds[cursor]=0x000000;};
cursor ++;
};
}
Now /= 10;
};
};
//===================================================================================================
void temperatur()//функция запроса температуры с датчика и её преобразование
{
sensors.requestTemperatures();
//int tempCP = sensors.getTempC(Thermometer1);
//TP=tempCP;
int tempCU = sensors.getTempC(Thermometer2);
TU=tempCU;
//Serial.println(T);
}
//===================================================================================================
void TimeAdjust(){ //функция корректировки времени через кнопки
int buttonH = digitalRead(5);
int buttonM = digitalRead(4);
if (buttonH == LOW || buttonM == LOW){
delay(200);
tmElements_t Now;
RTC.read(Now);
int hour=Now.Hour;
int minutes=Now.Minute;
int second =Now.Second;
if (buttonH == LOW){
if (Now.Hour== 23){Now.Hour=0;}
else {Now.Hour += 1;};
}else {
if (Now.Minute== 59){Now.Minute=0;}
else {Now.Minute += 1;};
};
RTC.write(Now);
}
}
//===================================================================================================
void displayClock() // функция вывода времени
{
int Now = GetTime();// Serial.print("Time is: ");Serial.println(Now);
convert(Now);// Get leds array with required configuration
FastLED.show();// Display leds array
}
//===================================================================================================
void displayYear() // функция вывода года
{
int Now = GetYear();
//Serial.print("Year is: ");Serial.println(Now);
convert(Now);// Get leds array with required configuration
FastLED.show();// Display leds array
}
//===================================================================================================
//===================================================================================================
void displayTemp2() // функция вывода температуры
{ temperatur();
int Now=TU;
if(TU<0)
{Now=TU*(-1);}
//Serial.println("Temp is: ");
//Serial.println(TU);
convertT(Now);
leds[22]=leds[23]=leds[24]=leds[25]=ledColor;
if(TU<0)
{leds[0]=ledColor;}
if(TU<=9&&TU>-10)
{leds[8]=leds[9]=leds[10]=leds[11]=leds[12]=leds[13]=ledColor;}
FastLED.show();// Display leds array
}
//===================================================================================================
void loop() // главный цикл
{
BrightnessCheck(); // вызов функции установки яркости
TimeAdjust(); // вызов функции корректировки времени
// smenaColor();
if (GetSecond() <= 6 || (GetSecond()>12 &&GetSecond()<=26) || (GetSecond()>32 &&GetSecond()<=46))
{displayClock();} //вызов функции отображения времени
// else if (GetSecond()>6 && GetSecond()<=9 || (GetSecond()>46 &&GetSecond()<=49))
// {displayTemp1();}//вызов функции отображения температуры в помещении
else if (GetSecond()>9 && GetSecond()<=12 || (GetSecond()>49 &&GetSecond()<=52))
{displayTemp2();}//вызов функции отображения температуры на улице
//else if (GetSecond()>26 && GetSecond()<=31 && dat>0 )
//{displayDate();}//вызов функции отображения даты
//else if (GetSecond()>29 && GetSecond()<=32 && dat>0)
// {displayYear();}//вызов функции отображения года
else {displayClock();}; //вызов функции отображения времени
}
//==========================================THE=END===================================================
dgeka, посмотрел код - похоже это снова всплыла та кривоватая версия, что мы тут правили на протяжении последних 4х страниц ветки. Честно говоря, править по новой все то, что я уже менял - мне лень. Процедуры Convert() ConverTT() -это просто пипец
В общем, напиши, как часто ты хочешь менять цвет - раз в час, раз в 10 часов или раз в 10 минут - вставлю в код только это
пришел датчик bme280 начались попытки переделать скетч под показ отрицательных температур вообщем цифру переместить на один символ вперед получилось , потушить первую цифру тоже, но вот с минусом ,то есть отрицательным числом побороть не могу . понимаю что надо полученый минус конвертировать в плюс и засветить символ - но программно сделать не могу , так что хелп !!!! :)
[code]
/*/Проект собран на основе желания сделать себе как у всех, но чуточку лучше. Основная работа по коду шла на
форуме <a href="http://arduino.ru." rel="nofollow">http://arduino.ru.</a> Конкретно началось с поста №58. Много людей помогали и вносили свою лепту
во всё это действо b707, bwn, GennOk.
Данный проект подходит под определение метео станция. Вывод данных о температуре, давлении и влажности. Так же основное
предназначение это показ часов. Очень много коментариев и росписей по кокретным блокам.
Проект универсальный, под разное количество LED-светодиодов, за это отдельное спасибо b707. Да и вообще большая часть кода
была переписана этим человеком. От того, что было изначально возможно осталась только идея))) Универсальность количества
диодов, переписана координатность символов, переназначение кнопок, отключение смены цветов либо смена по времени.
ВОЗМОЖНО в будущем появится вывод даты
////////////////////////////////////////////////////////////////////////////OdinochkA)))
*/
#include <Adafruit_BME280.h>
#include <DS3232RTC.h>
#include <Time.h>
#include <FastLED.h>
#define LEDS_IN_SEGMENT 1 // Задаём сколько у нас светодиодов в сегменте.
#define DOTS_NUM 1 // Задаём количество разделительных точек
#define COLOR_CHANGE 1 // ( 0 - НИКОГДА, 1 - каждую минуту, 2 - каждые 10 минут, 3 - каждый час, 4 - каждые 10 часов)
#define NUM_COLORS 16 // цветовая гамма
#define COLOR_ORDER BGR // По умолчанию цвет стоит зелёный при выключенных режимах
#define DATA_PIN 13 // подключение ленты
#define BRI_PIN A6 // фоторезистор
#define auto_bright 1 // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define max_bright 227 // максимальная яркость (0 - 255)
#define min_bright 0 // минимальная яркость (0 - 255)
#define bright_constant 1010 // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.7 // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;
Adafruit_BME280 bme; // BME280 давление, влажность, температура I2C
//BMP280 PINS //датчик подключается паралельно часам по I2C
//SCL -> SCL or A5
//SDA -> SDA or A4
// Вычислемые константы, НЕ РЕДАКТИРОВАТЬ!
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM) //86 количество светодиодов в ленте
//#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + 2) //86 количество светодиодов в ленте
//#define DOT1 (LEDS_IN_SEGMENT * 14) // координаты мигающих точек
//#define DOT2 (LEDS_IN_SEGMENT * 14 + 1) // координаты мигающих точек
CRGB leds[NUM_LEDS]; //Задаём значение светодиодов, какой символ из чего состоит
uint8_t digits[] = {
0b00111111, // Digit 0
0b00100001, // Digit 1
0b01110110, // Digit 2
0b01110011, // Digit 3
0b01101001, // Digit 4
0b01011011, // Digit 5
0b01011111, // Digit 6
0b00110001, // Digit 7
0b01111111, // Digit 8
0b01111011, // Digit 9
0b01111000, // Digit * градус 10
0b01000000, // Digit C 11
0b01111100, // Digit P 12
0b01111000, // Digit % знак % из двух частей 13
0b01000111, // Digit % знак % из двух частей 14
0b00000000, // Digit символ для температуры плюсовой 15
};
bool Dot = true;
bool DST = false;
bool TempShow = true;
bool PressureShow = true;
bool HumidityShow = true;
int last_digit = 0;
long ledColor = CRGB::Salmon; // Используемый цвет
//long ledColor = CRGB::MediumVioletRed;
long 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,
CRGB::DarkOrchid
};
void setup() {
Serial.begin(9600);
//Wire.begin();//Для BMP
LEDS.addLeds<WS2812, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);
bme.begin(); //bmp.begin(); //датчик температуры
//LEDS.setBrightness(75); // Задаём яркость
pinMode(4, INPUT_PULLUP); // Кнопка смены цветов
pinMode(3, INPUT_PULLUP); // Кнопка регулировки минут
pinMode(2, INPUT_PULLUP); // Кнопка регулировки часов
}
//новые координаты точек
void BrightDots (boolean Dot_On) {
for (uint8_t i = 0; i < DOTS_NUM; i++) {
leds[(LEDS_IN_SEGMENT * 14)+ i] = (Dot_On) ? ledColor : 0;
}
//leds[DOT2] = (Dot_On) ? ledColor : 0;
}
void BrightDigit (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 : 0;
cursor ++;
}
}
}
//Массив управляет яркостью
// Новый метод изменения яркости
void BrightnessCheck() {
if (auto_bright) { // если включена адаптивная яркость
if (millis() - bright_timer > 100) { // каждые 100 мс
bright_timer = millis(); // сбросить таймер
// Serial.print("Освещение: "); // вывод инфы в сом порт
// Serial.println(sensorValue); // вывод инфы в сом порт
new_bright = map(analogRead(6), 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); // установить новую яркость
}
}
};
// Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 155 вместо 0155O
int GetTime()
{
tmElements_t Now;
RTC.read(Now);
//time_t Now = RTC.Now();// Получаем данные текущего времени и его хранение
int hour = Now.Hour;
int minute = Now.Minute;
int second = Now.Second;
if (second % 2 == 0)
{
Dot = false;
}
else {
Dot = true;
};
return (hour * 100 + minute);
};
// Преобразуем время в массив для отображание
void TimeToArray() {
int Now = GetTime(); // Получаем время
BrightDots(Dot);
for (int i = 1; i <= 4; i++) {
int digit = Now % 10; // Получаем последнюю цифру в времениd
int cursor = NUM_LEDS - i * LEDS_IN_SEGMENT * 7;
if (i > 2) {
cursor -= DOTS_NUM;
//cursor -= 2;
}
BrightDigit(digits[digit], cursor);
if ( i == COLOR_CHANGE) {
if (digit != last_digit)
{
// cylon (); // цикличное изменение цветов
ledColor = ColorTable[random(NUM_COLORS)]; // цикличное изменение цветов
}
last_digit = digit;
}
Now /= 10;
};
};
// Функция вывода метеоданных
// Преобразуем Temp в массив для отображение
void TempToArray() {
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 25) {//через какое время показывать температуруi
TempShow = false;
return;
}
TempShow = true;
int t = bme.readTemperature(); //int t = bmp.readTemperature();
int celsius = t;
//=====================================================================
//=============== мои изменениядля для минусовых температур
{if(t<0)
BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); //65 начало знака Цельсия (*) 4й блокn
if(t<0)
{leds[0]=ledColor;}
if(t<=9&&t>-10)
BrightDigit(digits[0], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); // светим ноль если температура от 0 до 9 (*) 4й блокn
}
//===================================================
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); //65 начало знака Цельсия (*) 4й блокn
int digit = celsius % 10; //вывод десятка градусов
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //44 начало знака Градус (С) 3 блок
celsius /= 10; //вывод единиц градусов
digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //21 2й блок вывода второго символа
BrightDigit(digits[15], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));//гасим первую цифру
// BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //28 1й блок вывода первого символаo
};
//=====================================================================
//=====================================================================
// Измеряем давление
void PressureToArray() {
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 30) {//через какое время показывать давление
PressureShow = false;
return;
}
PressureShow = true;
int p = bme.readPressure() / 133.322; //int p = bmp.readPressure() / 133.322;c
int Pressure = p;
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //0 начало знака Давления (Р) 1й блокh
// Pressure /= 10;
int digit = Pressure % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7 )); //65 4й блок вывода третьей цифры значения
Pressure /= 10;
digit = Pressure % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //44 3й блок вывода второй цифры значенияk
Pressure /= 10;
digit = Pressure % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM )); //21 2й блок вывода первой цифры значения
};
//Вывод влажности
//Переделано на BME280 //Пример на DHT11
void HumidityToArray() {
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 35) {//через какое время показывать влажность
HumidityShow = false;
return;
}
HumidityShow = true;
int h = bme.readHumidity(); //int h = dht.readHumidity();
int humidity = h;
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[14], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); //65 конец знака процентов (%) 4й блок
BrightDigit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //44 начало знака процентов (%) 3 блок
int digit = humidity % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //21 2й блок вывода второго символаA
humidity /= 10;
digit = humidity % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //0 1й блок вывода первого символа
};
//смена цвета ленты кнопкой DST Pin 4
void DSTcheck() {
int buttonDST = digitalRead(4);
if (buttonDST == LOW) {
ledColor = ColorTable[random(NUM_COLORS)];
};
delay(500);//время реакции на нажатие
};
// Массив управляет кнопками с часами и минутами
void TimeAdjust() {
int buttonH = digitalRead(2);
int buttonM = digitalRead(3);
if (buttonH == LOW || buttonM == LOW) {
delay(100);//время реакции на нажатие
tmElements_t Now;
RTC.read(Now);
int hour = Now.Hour;
int minutes = Now.Minute;
int second = Now.Second;
if (buttonH == LOW) {
if (Now.Hour == 23) {
Now.Hour = 0;
}
else {
Now.Hour += 1;
};
}
else
{
if (Now.Minute == 59) {
Now.Minute = 0;
}
else {
Now.Minute += 1;
};
};
RTC.write(Now);
}
}
//Меняем эффекты
void fadeall() {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i].nscale8(250);
}
}
// массив отвечает за цикличное изменение цветов
void cylon () {
static uint8_t hue = 0;
Serial.print("x");
// Сдвигаем один светодиод в любом направлении
for (int i = 0; i < NUM_LEDS; i++) {
// Устанавливаем 1 светодиод на цвет красный
leds[i] = CHSV(hue++, 255, 255);
// Показываем светодиоды
FastLED.show();
fadeall();
// Ждём немного и повторяем цикл
delay(10);
}
//Serial.print("x");
// Сдвигаем один светодиод в любом направлении
for (int i = (NUM_LEDS) - 1; i >= 0; i--) {
// Устанавливаем 1 светодиод на цвет красный
leds[i] = CHSV(hue++, 255, 255);
// Показываем светодиоды
FastLED.show();
fadeall();
// Ждём немного и повторяем цикл
delay(10);
}
}
void loop()
{
BrightnessCheck(); // Проверяем датчик освещения
DSTcheck(); // Проверяем цветовые режимы
TimeAdjust(); // Проверяем время если сменилось на 1 цифру
TimeToArray(); // Проверяем часы если сменилось на 1 цифру
TempToArray(); // температура
PressureToArray(); // давление
HumidityToArray(); // если будет влажность
FastLED.show(); // Задаём массив светодиодов
if (TempShow == true) delay (5000); //время показа температуры
if (PressureShow == true) delay (5000);//время показа давления
if (HumidityShow == true) delay (5000);//время показа влажности
/*/
//вывод информации в сом порт
// Раскоментировать если нужно посмотреть в сом порте, маленько подтормаживает вся система если это открыто
Serial.print("Tемпература = ");
Serial.print(bme.readTemperature()); //Serial.print(bmp.readTemperature());
Serial.println("*C");
Serial.print ("Давление = ");
Serial.print (bme.readPressure() / 133.322); //Serial.print (bmp.readPressure() / 133.322); // Полученное значение в Па делим на 133,322 и получаем мм.рт.ст.
Serial.println (" mm"); // и соответственно меняем "Pa" на "mm"
Serial.print ("Влажность = ");
Serial.print (bme.readHumidity() ); // Serial.print (dht.readHumidity() ); //
Serial.println ("%\t"); //
Serial.println();
delay(8000);
Serial.println (" *OdinochkA* "); //
*/
}
[/code]
пришел датчик bme280 начались попытки переделать скетч под показ отрицательных температур вообщем цифру переместить на один символ вперед получилось , потушить первую цифру тоже
добавил условие но он при этом выдает при положительных температурах как надо 08 * ,а при отрицательных пишет -0 *. вообщем не светит единицы градусов ниже нет возможности опустить температуру
строчки с первой по восьмую просто выкинуть. они не нужны.
вместо них поставить
celcius = abs(t);
далее логика очень простая:
только первое знакоместо зависит от знака, если температура ниже нуля - туда выводим минус, если ноль и больше - не выводим ничего.
Все остальные позиции работают одинаково при любой температуре - во второй позиции десятки градусов. в третьей единицы. а четвертой - кружочек от знака градуса.
[code]
/*/Проект собран на основе желания сделать себе как у всех, но чуточку лучше. Основная работа по коду шла на
форуме <a href="http://arduino.ru." rel="nofollow">http://arduino.ru.</a> Конкретно началось с поста №58. Много людей помогали и вносили свою лепту
во всё это действо b707, bwn, GennOk.
Данный проект подходит под определение метео станция. Вывод данных о температуре, давлении и влажности. Так же основное
предназначение это показ часов. Очень много коментариев и росписей по кокретным блокам.
Проект универсальный, под разное количество LED-светодиодов, за это отдельное спасибо b707. Да и вообще большая часть кода
была переписана этим человеком. От того, что было изначально возможно осталась только идея))) Универсальность количества
диодов, переписана координатность символов, переназначение кнопок, отключение смены цветов либо смена по времени.
ВОЗМОЖНО в будущем появится вывод даты
////////////////////////////////////////////////////////////////////////////OdinochkA)))
*/
#include <Adafruit_BME280.h>
#include <DS3232RTC.h>
#include <Time.h>
#include <FastLED.h>
#define LEDS_IN_SEGMENT 1 // Задаём сколько у нас светодиодов в сегменте.
#define DOTS_NUM 1 // Задаём количество разделительных точек
#define COLOR_CHANGE 1 // ( 0 - НИКОГДА, 1 - каждую минуту, 2 - каждые 10 минут, 3 - каждый час, 4 - каждые 10 часов)
#define NUM_COLORS 16 // цветовая гамма
#define COLOR_ORDER BGR // По умолчанию цвет стоит зелёный при выключенных режимах
#define DATA_PIN 13 // подключение ленты
#define BRI_PIN A6 // фоторезистор
#define auto_bright 1 // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
#define max_bright 227 // максимальная яркость (0 - 255)
#define min_bright 0 // минимальная яркость (0 - 255)
#define bright_constant 1010 // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.7 // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
int new_bright, new_bright_f;
unsigned long bright_timer, off_timer;
Adafruit_BME280 bme; // BME280 давление, влажность, температура I2C
//BMP280 PINS //датчик подключается паралельно часам по I2C
//SCL -> SCL or A5
//SDA -> SDA or A4
// Вычислемые константы, НЕ РЕДАКТИРОВАТЬ!
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM) //86 количество светодиодов в ленте
//#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + 2) //86 количество светодиодов в ленте
//#define DOT1 (LEDS_IN_SEGMENT * 14) // координаты мигающих точек
//#define DOT2 (LEDS_IN_SEGMENT * 14 + 1) // координаты мигающих точек
CRGB leds[NUM_LEDS]; //Задаём значение светодиодов, какой символ из чего состоит
uint8_t digits[] = {
0b00111111, // Digit 0
0b00100001, // Digit 1
0b01110110, // Digit 2
0b01110011, // Digit 3
0b01101001, // Digit 4
0b01011011, // Digit 5
0b01011111, // Digit 6
0b00110001, // Digit 7
0b01111111, // Digit 8
0b01111011, // Digit 9
0b01111000, // Digit * градус 10
0b01000000, // Digit - 11
0b01111100, // Digit P 12
0b01111000, // Digit % знак % из двух частей 13
0b01000111, // Digit % знак % из двух частей 14
0b00000000, // Digit символ для температуры иплюсовой 15
};
bool Dot = true;
bool DST = false;
bool TempShow = true;
bool PressureShow = true;
bool HumidityShow = true;
int last_digit = 0;
long ledColor = CRGB::Salmon; // Используемый цвет
//long ledColor = CRGB::MediumVioletRed;
long 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,
CRGB::DarkOrchid
};
void setup() {
Serial.begin(9600);
//Wire.begin();//Для BMP
LEDS.addLeds<WS2812, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);
bme.begin(); //bmp.begin(); //датчик температуры
//LEDS.setBrightness(75); // Задаём яркость
pinMode(4, INPUT_PULLUP); // Кнопка смены цветов
pinMode(3, INPUT_PULLUP); // Кнопка регулировки минут
pinMode(2, INPUT_PULLUP); // Кнопка регулировки часов
}
//новые координаты точек
void BrightDots (boolean Dot_On) {
for (uint8_t i = 0; i < DOTS_NUM; i++) {
leds[(LEDS_IN_SEGMENT * 14)+ i] = (Dot_On) ? ledColor : 0;
}
//leds[DOT2] = (Dot_On) ? ledColor : 0;
}
void BrightDigit (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 : 0;
cursor ++;
}
}
}
//Массив управляет яркостью
// Новый метод изменения яркости
void BrightnessCheck() {
if (auto_bright) { // если включена адаптивная яркость
if (millis() - bright_timer > 100) { // каждые 100 мс
bright_timer = millis(); // сбросить таймер
// Serial.print("Освещение: "); // вывод инфы в сом порт
// Serial.println(sensorValue); // вывод инфы в сом порт
new_bright = map(analogRead(6), 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); // установить новую яркость
}
}
};
// Получаем время в одном номере, если часы будет только одна цифра то будет отображаться 155 вместо 0155O
int GetTime()
{
tmElements_t Now;
RTC.read(Now);
//time_t Now = RTC.Now();// Получаем данные текущего времени и его хранение
int hour = Now.Hour;
int minute = Now.Minute;
int second = Now.Second;
if (second % 2 == 0)
{
Dot = false;
}
else {
Dot = true;
};
return (hour * 100 + minute);
};
// Преобразуем время в массив для отображание
void TimeToArray() {
int Now = GetTime(); // Получаем время
BrightDots(Dot);
for (int i = 1; i <= 4; i++) {
int digit = Now % 10; // Получаем последнюю цифру в времениd
int cursor = NUM_LEDS - i * LEDS_IN_SEGMENT * 7;
if (i > 2) {
cursor -= DOTS_NUM;
//cursor -= 2;
}
BrightDigit(digits[digit], cursor);
if ( i == COLOR_CHANGE) {
if (digit != last_digit)
{
// cylon (); // цикличное изменение цветов
ledColor = ColorTable[random(NUM_COLORS)]; // цикличное изменение цветов
}
last_digit = digit;
}
Now /= 10;
};
};
// Функция вывода метеоданных
// Преобразуем Temp в массив для отображение
void TempToArray() {
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 25) {//через какое время показывать температуруi
TempShow = false;
return;
}
TempShow = true;
int t = bme.readTemperature(); //int t = bmp.readTemperature();
int celsius = t;
//=============== мои изменениядля минусовых температур
//===========================================================
celsius = abs(t); //преобразование отрицательного числа в положительное
//===================================================
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); // знак Цельсия (*) 4й блок
if(t<0)
BrightDigit(digits[11], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));//светим знак минус если ниже 0
if(t>=0) //добавил условие что-бы при 0 не показывало 000* градусов цельсия
BrightDigit(digits[15], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));//гасим первую цифру
int digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); // 3 блок единицы градуса
celsius /= 10;
digit = celsius % 10;
//int digit = celsius % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); // 2й блок десятки градусов
};
//===========================================================
//===========================================================
// Измеряем давление
void PressureToArray() {
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 30) {//через какое время показывать давление
PressureShow = false;
return;
}
PressureShow = true;
int p = bme.readPressure() / 133.322; //int p = bmp.readPressure() / 133.322;c
int Pressure = p;
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[12], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //0 начало знака Давления (Р) 1й блокh
// Pressure /= 10;
int digit = Pressure % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7 )); //65 4й блок вывода третьей цифры значения
Pressure /= 10;
digit = Pressure % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //44 3й блок вывода второй цифры значенияk
Pressure /= 10;
digit = Pressure % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM )); //21 2й блок вывода первой цифры значения
};
//Вывод влажности
//Переделано на BME280 //Пример на DHT11
void HumidityToArray() {
tmElements_t tm;
RTC.read(tm);
if (tm.Second != 35) {//через какое время показывать влажность
HumidityShow = false;
return;
}
HumidityShow = true;
int h = bme.readHumidity(); //int h = dht.readHumidity();
int humidity = h;
BrightDots(0); //разделительные мигающие точки выключены
BrightDigit(digits[14], (NUM_LEDS - LEDS_IN_SEGMENT * 7)); //65 конец знака процентов (%) 4й блок
BrightDigit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 14)); //44 начало знака процентов (%) 3 блок
int digit = humidity % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //21 2й блок вывода второго символаA
humidity /= 10;
digit = humidity % 10;
BrightDigit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //0 1й блок вывода первого символа
};
//смена цвета ленты кнопкой DST Pin 4
void DSTcheck() {
int buttonDST = digitalRead(4);
if (buttonDST == LOW) {
ledColor = ColorTable[random(NUM_COLORS)];
};
delay(500);//время реакции на нажатие
};
// Массив управляет кнопками с часами и минутами
void TimeAdjust() {
int buttonH = digitalRead(2);
int buttonM = digitalRead(3);
if (buttonH == LOW || buttonM == LOW) {
delay(100);//время реакции на нажатие
tmElements_t Now;
RTC.read(Now);
int hour = Now.Hour;
int minutes = Now.Minute;
int second = Now.Second;
if (buttonH == LOW) {
if (Now.Hour == 23) {
Now.Hour = 0;
}
else {
Now.Hour += 1;
};
}
else
{
if (Now.Minute == 59) {
Now.Minute = 0;
}
else {
Now.Minute += 1;
};
};
RTC.write(Now);
}
}
//Меняем эффекты
void fadeall() {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i].nscale8(250);
}
}
// массив отвечает за цикличное изменение цветов
void cylon () {
static uint8_t hue = 0;
Serial.print("x");
// Сдвигаем один светодиод в любом направлении
for (int i = 0; i < NUM_LEDS; i++) {
// Устанавливаем 1 светодиод на цвет красный
leds[i] = CHSV(hue++, 255, 255);
// Показываем светодиоды
FastLED.show();
fadeall();
// Ждём немного и повторяем цикл
delay(10);
}
//Serial.print("x");
// Сдвигаем один светодиод в любом направлении
for (int i = (NUM_LEDS) - 1; i >= 0; i--) {
// Устанавливаем 1 светодиод на цвет красный
leds[i] = CHSV(hue++, 255, 255);
// Показываем светодиоды
FastLED.show();
fadeall();
// Ждём немного и повторяем цикл
delay(10);
}
}
void loop()
{
BrightnessCheck(); // Проверяем датчик освещения
DSTcheck(); // Проверяем цветовые режимы
TimeAdjust(); // Проверяем время если сменилось на 1 цифру
TimeToArray(); // Проверяем часы если сменилось на 1 цифру
TempToArray(); // температура
PressureToArray(); // давление
HumidityToArray(); // если будет влажность
FastLED.show(); // Задаём массив светодиодов
if (TempShow == true) delay (5000); //время показа температуры
if (PressureShow == true) delay (5000);//время показа давления
if (HumidityShow == true) delay (5000);//время показа влажности
/*/
//вывод информации в сом порт
// Раскоментировать если нужно посмотреть в сом порте, маленько подтормаживает вся система если это открыто
Serial.print("Tемпература = ");
Serial.print(bme.readTemperature()); //Serial.print(bmp.readTemperature());
Serial.println("*C");
Serial.print ("Давление = ");
Serial.print (bme.readPressure() / 133.322); //Serial.print (bmp.readPressure() / 133.322); // Полученное значение в Па делим на 133,322 и получаем мм.рт.ст.
Serial.println (" mm"); // и соответственно меняем "Pa" на "mm"
Serial.print ("Влажность = ");
Serial.print (bme.readHumidity() ); // Serial.print (dht.readHumidity() ); //
Serial.println ("%\t"); //
Serial.println();
delay(8000);
Serial.println (" *OdinochkA* "); //
*/
}
[/code]
тут я не помогу, сам долго выпрашивал чтоб ткнули носом где че менять ,я в програмировании только базовые примеры делал . дальше примеров для меня что то волшебное
[/quote] а чем те, что стоят в этом коде - тяжелые? Гайвер писатель еще тот, я по своей воле его библиотеки использовать не стал бы[/quote]
Здравствуйте. Мои часы (пост #275) подтупливают уже 9 месяцев, то давление пропустят,не покажут, то влажность, и точки мигают с разным интервалом,но это всё не критично. За это время пару раз отключал от питания, розетки просто надо было. Вот и подумал про библиотеки.
6000 строк на часы? Или сейчас уже восемь? AyuOX, делайте его часы
строки что ли жалеете ?
Есть ещё проектик "монитор СО2" там поменьше строк
Вот бы кто помог платку развести для него. Тому вышлю эту платку, сделанную в китае и корпус напечатаный на 3D-шнике.
И есть ещё проектик "сталкер" это портативный прочный прибор
фонарь белый + лазер + УФ
таймер, градусник, люксметр
подключение внешнего датчика (охранный шлейф или ИК датчик движения, вибрации и т.п.)
с программируемой реакцией на любой "раздражитель".
Реакцией может быть
-включение или выключение фонарей
-громкая или тихая мелодия
-дёргание сервой
-запуск таймера
-управление симистором
может сказали когда-то, что оплата будет построчной, тут то премии и поперли.))))
— Придется пройти, — сказал, наконец, милиционер.
Мы прошли. Пока мы проходили, в толпе сопровождающих было создано несколько вариантов моей нелегкой биографии и был сформулирован ряд причин, вызвавших начинающееся у всех на глазах следствие.
Стругацкие "Понедельник...
Просто 707-ой не может поверить что даже достаточно простые часы могут потребовать достаточно большого кода.
Он ведь его и в глаза не видел.
Сейчас в часики добавлена фича "вантач таймер", автоинверсия кнопок и вариант с одним светиком на сегмент.
В прочем это уже совсем мелочи
Да там я убрал что вы писали, все равно тупит, но мне не мешают эти глюки. О них знаю только я, а остальным пофиг. Просто хотелось чтоб всё четко было, как задумано)).
Если резистор работает в обратную сторону - он может стоять не в том плече.
Ну, дык, куды китаясь прицепил. Вверх не полез, но если на модуле только делитель, то поменять местами питание, и усё.
P/S Виноват, не глянул, не прокатило.))))
P/P/S Возьмите обычный делитель и подключите к аналоговому пину как надо. ИМХО.
то что резистор работает в обратную сторону, я с ним ничего не сделаю. Если только в коде указывать данные, чтобы это учитывать.
не надо с резистором ничего делать, все отлично настраивается программно
new_bright_f = new_bright_f * coef - new_bright * (1 - coef);
как для вычисления неизвестного, мы это самое неизвестное умножаем на коэфициент?? Не тут ли ошибка?
нет тут никакой ошибки. Разве что вы опять зачем то вставили в формулу "минус". Мы ведь вроде уже обсуждали, тут нужен "пдюс", правильная формула -
new_bright_f = new_bright_f * coef + new_bright * (1 - coef);
А что до того, "что для вычисления неизвестного, мы это самое неизвестное умножаем на коэфициент??" - так это очень просто. Значение new_bright_f, стоящее в правой стороне формулы - это прежнее значение яркости, а в левой (в результате) - это то значение, которое мы вычисляем. И смысл этой формулы очень прост - берем 90% прежней яркости. прибавляем 10% нового значения - и так на каждом круге loop. Таким образом при смене освещения у нас яркость диодов не "прыгает", а меняется плавно.
Их этого обьяснения, надеюсь, теперь понятно, что в формуле может быть только "плюс", а никак не минус.
В формуле, конечно, несколько странные имена переменных, которые сбивают с толку. Но это не ко мне, автор формулы не я :)
Здравствуйте! Решил себе поставить резистор на автояркость - не работает. Прикупил себе gy-30, но не понимаю к каким выводам его припаять, и нужно ли менять код? Подскажите пожалуйста.
Прикупил себе gy-30, но не понимаю к каким выводам его припаять, и нужно ли менять код? Подскажите пожалуйста.
На яндексе забанили чтоли? https://lesson.iarduino.ru/page/podklyuchaem-bh1750-datchik-osveschennosti-gy-30-gy-302-k-arduino/
Их этого обьяснения, надеюсь, теперь понятно, что в формуле может быть только "плюс", а никак не минус.
В формуле, конечно, несколько странные имена переменных, которые сбивают с толку. Но это не ко мне, автор формулы не я :)
Вот еще как возможный вариант смены цветов
https://www.youtube.com/watch?v=6mAk30DfoFE
Вот еще как возможный вариант смены цветов
https://www.youtube.com/watch?v=6mAk30DfoFE
Я уже предлагал такой вариант с меню и настройкой всего и вся под себя. довольно интересные часики. интересно на чем реализована вся логика на этих часиках, там деталей минимум (любимая нами 3231, неизвестный MCU типо нашей меги или STM, пассивный бузер, пара сенсорных кнопок и горсть 5050 да SMD мелочёвки). а функционал не плохой, настроек много как цвета так и времени с яруостью, даже какая то активация голосом есть, будильник имеется. вот что нибудь подобное и хочется иметь в наших народных часах.
https://yadi.sk/i/_lnZ-zN-ONJ6nw тут по подробнее
не смог я пока осилить скетч из 303 поста в плане отрицательных температур, на просторах интернета нашел скетч на даласовском датчике покорчевал под свои потребности теперь минус светят (при отрицательных температурах) ,но меня смущает то что лента не используется в полной мере и светится только один цвет забитый при заливке скетча . Так вот просьба помочь допитлить чтоб как в 303 посте смену цвета можно было устанавливать 0,1,2,3 . Сам до такого не дорос прошу хелпануть :)
привет, dgeka - если никто не ответит раньше, посмотрю завтра-послезавтра, сейчас очень много работы
dgeka, посмотрел код - похоже это снова всплыла та кривоватая версия, что мы тут правили на протяжении последних 4х страниц ветки. Честно говоря, править по новой все то, что я уже менял - мне лень. Процедуры Convert() ConverTT() -это просто пипец
В общем, напиши, как часто ты хочешь менять цвет - раз в час, раз в 10 часов или раз в 10 минут - вставлю в код только это
раз в 10 минут достаточно, странно я здесь код не видел, я его на драйв ту ру надыбал :)
пришел датчик bme280 начались попытки переделать скетч под показ отрицательных температур вообщем цифру переместить на один символ вперед получилось , потушить первую цифру тоже, но вот с минусом ,то есть отрицательным числом побороть не могу . понимаю что надо полученый минус конвертировать в плюс и засветить символ - но программно сделать не могу , так что хелп !!!! :)
пришел датчик bme280 начались попытки переделать скетч под показ отрицательных температур вообщем цифру переместить на один символ вперед получилось , потушить первую цифру тоже
покажите, в каком месте кода вы двигали цифры?
вот кусочек
ну так в чем проблема? - если температура отрицательная, вместо того чтоб просто гасить первую цифру, выводите в нее знак "минус"
добавил условие но он при этом выдает при положительных температурах как надо 08 * ,а при отрицательных пишет -0 *. вообщем не светит единицы градусов ниже нет возможности опустить температуру
строчки с первой по восьмую просто выкинуть. они не нужны.
вместо них поставить
celcius = abs(t);
далее логика очень простая:
только первое знакоместо зависит от знака, если температура ниже нуля - туда выводим минус, если ноль и больше - не выводим ничего.
Все остальные позиции работают одинаково при любой температуре - во второй позиции десятки градусов. в третьей единицы. а четвертой - кружочек от знака градуса.
Все
вот что получилось
теперь заработало !!!огромное спасибищее ВАМ !!!b707 за тыканье мордочкой в нужное место и помощь
вот весь код
но как всегда аппетит приходит во время еды хочется что бы на последних или первых секундах была анимация :)
нужен хелп
но как всегда аппетит приходит во время еды хочется что бы
Плавность смены цифр чтобы ночью глаза не "дёргало"
5 градусников, десятые доли градусов
Пользовательская настройка цветов
коррекция хода
настройки через блютус или вайфай
Бой с настройкой громкости
"тихий час"
несколько будильников
https://youtu.be/7eOAVlV6NaM
Плавность смены цифр чтобы ночью глаза не "дёргало"
сделайте плавную яркость
+ 30 строк к оду
и так есть - смотрите в коде внимательно
настройки через блютус или вайфай
коррекция вещь полезная. Но куда полезнее автосинхронизация по NTP. раз уж вайфай есть. при наличии ЕСП модуля для вайфай - вопрос 50 строк
да, это полезно, будем ждать чтобы кто-нибудь добавил
Только в итоге, вы же наверно уже сами понимаете - расширим мы функционал до вашего - размер кода даже 1000 строк не достигнет
флаг в руки ))
ну вы же понимаете. что все вышеперечисленное никак не тянет на 5700 строк, на которые ваш код отличается от местного. И гордится тут нечем.
так как с переходом ?поможет кто то? из примера fastled "циклон" есть а не работает :( ?
С Новым годом!!!
Взаимно
Здравствуйте.
Хотел узнать как работает код 405 поста ? Неужели всё нормально, а то давно ничего не писали.
И ещё вопрос, Гайвер написал легкие библиотеки, кто нибудь ставил их в этот код?
Ардуинка накрылась :( новая ещё недойдет никак
Печально. У меня тоже 2 штуки сгорели, но часы еще работают.
Код рабочий ,просто хотел сделать уличные часы но как в всегда что-то пошло не так
Так у тебя вроде с 303 поста код был
И 420 пост это тот же с 303 переделанный под отриц температуры
А как ещё термодатчик добавить, отдельно на улицу вынести?
Не часы на улице висеть должны были по задумке bme280 мерят до -50
Я понял что на улице, просто себе добавить хочу чтоб ещё уличную температуру показывали, а как в код записать не знаю.
тут я не помогу, сам долго выпрашивал чтоб ткнули носом где че менять ,я в програмировании только базовые примеры делал . дальше примеров для меня что то волшебное
И ещё вопрос, Гайвер написал легкие библиотеки, кто нибудь ставил их в этот код?
а чем те, что стоят в этом коде - тяжелые?
Гайвер писатель еще тот, я по своей воле его библиотеки использовать не стал бы
[/quote] а чем те, что стоят в этом коде - тяжелые? Гайвер писатель еще тот, я по своей воле его библиотеки использовать не стал бы[/quote]
Здравствуйте. Мои часы (пост #275) подтупливают уже 9 месяцев, то давление пропустят,не покажут, то влажность, и точки мигают с разным интервалом,но это всё не критично. За это время пару раз отключал от питания, розетки просто надо было. Вот и подумал про библиотеки.
А что Гайвер плохо пишет? Вроде шарит в ардуино.
Так я вам еще тогда, в 276 или 277м посте, писал в чем проблема кода. Его надо переписывать без делеев.
Что касается Гайвера - он блоггер, а не программист
1.Нормально он пишет.
2. Туташний скетч это просто набросочек.
Делайте мои часы. Это реально проработанный и проверенный временем, проект
Делайте мои часы. Это реально проработанный и проверенный временем, проект
6000 строк на часы? Или сейчас уже восемь?
AyuOX, делайте его часы
Есть ещё проектик "монитор СО2" там поменьше строк
Вот бы кто помог платку развести для него. Тому вышлю эту платку, сделанную в китае и корпус напечатаный на 3D-шнике.
И есть ещё проектик "сталкер" это портативный прочный прибор
фонарь белый + лазер + УФ
таймер, градусник, люксметр
подключение внешнего датчика (охранный шлейф или ИК датчик движения, вибрации и т.п.)
с программируемой реакцией на любой "раздражитель".
Реакцией может быть
-включение или выключение фонарей
-громкая или тихая мелодия
-дёргание сервой
-запуск таймера
-управление симистором
Вас бы кто-нибудь научил код писать нормально....
Все что я думаю о вашем коде - я сказал в прошлый раз.
Эт с какой стороны смотреть, может сказали когда-то, что оплата будет построчной, тут то премии и поперли.))))
Давайте что-нибудь замутим интересное.
— Придется пройти, — сказал, наконец, милиционер.
Мы прошли. Пока мы проходили, в толпе сопровождающих было создано несколько вариантов моей нелегкой биографии и был сформулирован ряд причин, вызвавших начинающееся у всех на глазах следствие.
Стругацкие "Понедельник...
Просто 707-ой не может поверить что даже достаточно простые часы могут потребовать достаточно большого кода.
Он ведь его и в глаза не видел.
Сейчас в часики добавлена фича "вантач таймер", автоинверсия кнопок и вариант с одним светиком на сегмент.
В прочем это уже совсем мелочи
Да там я убрал что вы писали, все равно тупит, но мне не мешают эти глюки. О них знаю только я, а остальным пофиг. Просто хотелось чтоб всё четко было, как задумано)).
Давайте что-нибудь замутим интересное.
Конечно замутите, например эмитацию пламени в камине из 5 лент по 24 диода, с простым кодом.
https://www.youtube.com/watch?v=GKJtHPJ6qag