Когда я заливаю скетч которий должен отображать дату время температуру и влажность но дата изначально стоит 2000 01 01 и время 0 00 так вот время и дата должни отображатса текущие тоесть настольние часи но етого непроисходить. Так понятно или нет.
Вытащите эту строку наружу из if-а, внутри которого она сейчас стоит. И проделайте описанные операции: раскомментировать, залить скетч, закомментировать обратно, залить скетч.
if (c == 0xB8) c = c - 0x01; // Коррекция кодов символа под таблицу ???? так как русские символы в таблице сдвинуты относительно стандартной кодировки utf на 1 символ
if (c >= 0xBF && c <= 0xFF) c = c - 0x01;
Serial_string = Serial_string + String(char(c)); //Добавить символ в строку
}
return Serial_string;
}
//*ПЕРЕМЕНЫЕ
//**********************************
String mesyc = " ";
//**********************************
void setup() {
Serial.begin(9600);
delay(1000); // выполняем задержку для перехода датчика в активное состояние
matrix.setIntensity(1); // Используйте значение между 0 и 15 для яркости
for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ )
{
matrix.fillScreen(LOW);
int letter = i / width; // номер символа выводимого на матрицу
int x = (matrix.width() - 1) - i % width;
int y = (matrix.height() - 8) / 2; // отцентрировать текст по вертикали
while ( x + width - spacer >= 0 && letter >= 0 ) {
if ( letter < tape.length() ) {
matrix.drawChar(x, y, tape[letter], HIGH, LOW,1);
}
letter--;
x -= width;
}
matrix.write(); // Отправить картинку для отображения
delay(wait);
}
//delay(2000);
}
tape = (mesyc +"Temperature: "+tCelsius +"`C "+"Pressure: "+tPressure+" Rt.St"); в этой строке если указать, как у тебя в исходнике, utf8rus - получается абра кадабра! ЧТО НЕ ТАК?
Собрал часики по теме, всё замечательно работает. Теперь интересует вопрос. Собственно, он уже был задан в посте #32, а в #36 дан ответ. Не силён в программировании, но может кто подскажет, как "прикрутить" ответ в коде. Время 1:7 и правда смотрится не айс, а вот 01:07 будет актуально. И ещё, может кто знает, как убрать последний ноль из погоды (температура и влажность показывает в формате 00,00, а хотелось бы 00,0) и как поставить "+" летом и "-" зимой в показаниях температуры?
Можно. конечно, и постебаться. А по сути вопросов? Я не силён в программировании и использую опыт специалистов с некоторыми доработками. В далёком дестве в радиокружке на СЮТ это называлось "повторением", т.е. собирали конструкции уже кем-то разработанные. Иногда сам нахожу ответ. покурив тырнет, а иногда и помощь оказывают - мир не без добрых людей :)
Собрал часики по теме, всё замечательно работает. Теперь интересует вопрос. Собственно, он уже был задан в посте #32, а в #36 дан ответ. Не силён в программировании, но может кто подскажет, как "прикрутить" ответ в коде. Время 1:7 и правда смотрится не айс, а вот 01:07 будет актуально.
char buf[6];
sprintf(buf,"%02d:%02d",hour, minutes);
КудаНада.print(buf);
Toropizhka пишет:
И ещё, может кто знает, как убрать последний ноль из погоды (температура и влажность показывает в формате 00,00, а хотелось бы 00,0)
char buf[10];
dtostr(temperature, 5,1,&buf[1]);
Toropizhka пишет:
и как поставить "+" летом и "-" зимой в показаниях температуры?
Первую конструкцию собирал на 7-сегментных индикаторах. Тогда только собрал, "отрегулировал" код и смотрел как зима пришла: температура за бортом с +8 до -12 за пару часов упала...
Сейчас тоже не работаю, пока. Вперспективе хочу собрать информер: часы, календарь, погода и напоминалка бегущей строкой (праздники, дни рождения и прочее)...
Может и лишняя, но интересная. Пока памяти хватает....
Остался извечный вопрос: как "прикрутить" два датчика DHT22 к контроллеру? И коды ковырял, и библиотеки кромсал - хоть убей, с одного только датчика показывает или выдаёт ошибку...
А ежели она будет напоминать, что уже пятница и надобывыпить - тогда тоже лишняя?
Жжёшь :)
Напоминалка, конечно же. вещь интересная и полезная. Вот только у меня тяму хватило прописывать конкретную дату:
if ((month==9) && (dayOfMonth ==9)){znam_den = "День Танкиста";}
Такой вариант не совсем удобен, поскольку праздник отмечается ежегодно второе воскресенье сентября. Т.е. каждый год ужно корректировать. Равно как и каждую пятницу...
if ((month==9) && (dayOfMonth ==9)){znam_den = "День Танкиста";}
Такой вариант не совсем удобен, поскольку праздник отмечается ежегодно второе воскресенье сентября. Т.е. каждый год ужно корректировать. Равно как и каждую пятницу...
if ((month==9) && (dayOfMonth ==9)){znam_den = "День Танкиста";}
Такой вариант не совсем удобен, поскольку праздник отмечается ежегодно второе воскресенье сентября. Т.е. каждый год ужно корректировать. Равно как и каждую пятницу...
Собрал, запустил, пока работает покупаю детальки. Года через 1,5 - 2 надоело - разобрал, собрал новое. Итого, промежуток между творческим фанатизмом 1 - 3 года :)
Сталкивался с такой проблемой: вроде код правильный, а отображение идёт либо что попало, либо со сдвигом на одну букву. Одно время даже в Excel набросал себе скрипт, чтобы писать правильный текст. который переводился в неправильный, вставлял в код и матрицы отображали правильный. В конце-концов перепроверил код несколько раз и нашёл ошибку (или лишний знак, или не хватало уж не помню). Исправил и всё встало на свои места...
Доброго времени суток! искал нечто похожее, нашел почти то что надо! подскажи как руссифицировать сообщения? Вот что у меня получилось
Посмотри #79, там весь код. Проверь всё касаемо русификации, может тоже найдёшь проблему. Кстати, первое время, по неопытности, коды писал-редактировал в Word, а потом тупо копировал и вставлял в Arduino IDE. В итоге часто ишибки выбивало...
Сейчас тоже не работаю, пока. Вперспективе хочу собрать информер: часы, календарь, погода и напоминалка бегущей строкой (праздники, дни рождения и прочее)...
Тогда надо контроллер Мегу брать или на ЕСПшке собирать . В ардуино нано, уно ... больше нескольких строчек не запихнешь .
контроллер Мегу брать или на ЕСПшке собирать . В ардуино нано, уно ... больше нескольких строчек не запихнешь .
С чего бы то? Флэша там немало+ епром.
Видео в студию !!
Пробовал могократно впихуть побольше... остается место ... проект компилируется-заливается и после первой строки идет сбой. Если отказаться от датчиков - можно больше залить текста. В старом проекте выводится время, дата , показания с трех датчиков температуры и три рандомные фразы общим объемом 130 символов. +еще текст идет с показаниями датчиков .
Так проблема не в нане с уной. Проблема в стрингах, они память засирают. Я пока ричу с керниганом до конца не освоил, проект валяется. Примерно сутки работал, потом вываливался.
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
#include <avr/wdt.h>
#include <avr/pgmspace.h>
#include <OneWire.h>
OneWire ds(9);
#include <iarduino_Pressure_BMP.h>
iarduino_Pressure_BMP sensor(0x76); //BMP280 по шине I2C
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
#include <EEPROM.h>
#include "DHT.h"
//****************Инициализация и входы DHT**********************
#define DHTPIN 4
// Uncomment whatever type you're using!
//#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor
DHT dht(DHTPIN, DHTTYPE);
//--------------------------------------------------------------------
//******ОБЪЯВЛЕНИЕ ВХОДОВ-ВЫХОДОВ**********
const byte led0 = 8; //Светодиод сигнальный
const byte led1 = 5; //Светодиод 1
const byte led2 = 6; //Светодиод 2
const byte led3 = 7; //Светодиод 3
const byte buz = 3; //Бузер
const byte pinCS = 10; //Пин выбора матриц
//---------------------------------------------------------
//*****НАСТРОЙКА и переменные МАТРИЦ****************
const byte numberOfHorizontalDisplays = 1;
const byte numberOfVerticalDisplays = 8;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
String tape = ""; // Строка для отображения
String slTape = "";
String oldTape = ""; //Предыдущая отображаемая строка
String tapeTime = ""; //Строка времени
String tapeDate = ""; //Строка даты
String tapePressure = ""; //Строка давления
String tapeTempHum = ""; //Строка влажности, температуры
String tapeHol = ""; //Строка праздничных дней
byte spacer = 2; // Промежуток между символами (кол-во точек)
byte width = 5 + spacer; // Ширина символа
byte win; // Номер экрана
byte matIntensiv = 2; // Переменная яркости экрана
boolean flagHoliday = false; //Флаг праздника
//----------------------------------------------------
//******Переменные Далласов***************************
byte addr[2] [8] = {{0x28, 0xFF, 0x80, 0x95, 0x72, 0x15, 0x03, 0xB2}, {0x28, 0xFF, 0x4E, 0xE1, 0x72, 0x15, 0x03, 0x94}};
float Temp[2];
int flagDallRead;
boolean flagAlarm;
float tempAlarm;
float ustavka = 50.0;
float gister = 3.0;
//----------------------------------------------------
//*******Переменные барометра*************************
float pressure;
// float temp_bmp280;
//-----------------------------------------------------
//*******Переменные для часов**************************
Time dataTime;
byte hours;
byte minute;
boolean flagDataAlarm = true; //Флаг некорректной даты-времени
//---------------------------------------
//*******Аналоговые переменные************
byte tumbler;
//----------------------------------------
//*******Строковые константы*************
const char* str_1 = "ПЕРЕПЕЛА";
const char* str_2 = "ЯЙЦО,";
const char* str_3 = " с 10 до 18";
const char* str_4 = "МОЛОДНЯК,КЛЕТКИ";
const char* str_5 = ".ВХОД С ПЕРЕУЛКА.";
const char day_1[] PROGMEM = "Понедельник";
const char day_2[] PROGMEM = "Вторник";
const char day_3[] PROGMEM = "Среда";
const char day_4[] PROGMEM = "Четверг";
const char day_5[] PROGMEM = "Пятница";
const char day_6[] PROGMEM = "Суббота";
const char day_7[] PROGMEM = "Воскресенье";
const char* const str_day[] PROGMEM = {day_1, day_2, day_3, day_4, day_5, day_6, day_7};
const char mon_1[] PROGMEM = "Января";
const char mon_2[] PROGMEM = "Февраля";
const char mon_3[] PROGMEM = "Марта";
const char mon_4[] PROGMEM = "Апреля";
const char mon_5[] PROGMEM = "Мая";
const char mon_6[] PROGMEM = "Июня";
const char mon_7[] PROGMEM = "Июля";
const char mon_8[] PROGMEM = "Августа";
const char mon_9[] PROGMEM = "Сентября";
const char mon_10[] PROGMEM = "Октября";
const char mon_11[] PROGMEM = "Ноября";
const char mon_12[] PROGMEM = "Декабря";
const char* const str_mon[] PROGMEM = {mon_1, mon_2, mon_3, mon_4, mon_5,
mon_6, mon_7, mon_8, mon_9, mon_10, mon_11, mon_12};
/*
const char hol_1[] PROGMEM = "Новым годом";
const char hol_2[] PROGMEM = "Рождеством";
const char hol_3[] PROGMEM = "Днем снятия блокады";
const char hol_4[] PROGMEM = "Днем защитника Отечества";
const char hol_5[] PROGMEM = "Международным женским днем";
const char hol_6[] PROGMEM = "Днем космонавтики";
const char hol_7[] PROGMEM = "Праздником Весны и Труда";
const char hol_8[] PROGMEM = "ДНЕМ ПОБЕДЫ";
const char hol_9[] PROGMEM = "Днем России";
const char hol_10[] PROGMEM = "Днем знаний";
const char hol_11[] PROGMEM = "Днем народного единства";
const char hol_12[] PROGMEM = "Днем согласия и примирения";
const char hol_13[] PROGMEM = "Днем Конституции";
const char* const str_hol[] PROGMEM = {hol_1, hol_2, hol_3, hol_4, hol_5,
hol_6, hol_7, hol_8, hol_9, hol_10, hol_11, hol_12, hol_13};
*/
//-----------------------------------------
//********ФУНКЦИИ***********
//****Декодирование в русские символы*****
String utf8rus(String source)
{
int i, k;
String target;
unsigned char n;
char m[2] = { '0', '\0' };
k = source.length(); i = 0;
while (i < k) {
n = source[i]; i++;
if (n >= 0xC0) {
switch (n) {
case 0xD0: {
n = source[i]; i++;
if (n == 0x81) {
n = 0xA8;
break;
}
if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
break;
}
case 0xD1: {
n = source[i]; i++;
if (n == 0x91) {
n = 0xB7;
break;
}
if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
break;
}
}
}
m[0] = n; target = target + String(m);
}
return target;
}
//-------------------------------------------------------------
//******Мигалка и WDT***************************
void ledBlink(unsigned long interval) {
static unsigned long prevTime = 0;
if (millis() - prevTime > interval) {
prevTime = millis();
digitalWrite(led0, !digitalRead(led0));//Инвертируем светик
wdt_reset(); //Команда "Фу"
}
}
//-------------------------------------------------------------
//***Функция считывания температуры c Далласов*****
void dallRead(unsigned long interval) {
static unsigned long prevTime = 0;
if (millis() - prevTime > interval) { //Проверка заданного интервала
static boolean flagDall = 0; //Признак операции
prevTime = millis();
flagDall = ! flagDall; //Инверсия признака
if (flagDall) {
ds.reset();
ds.write(0xCC); //Обращение ко всем датчикам
ds.write(0x44); //Команда на конвертацию
flagDallRead = 750; //Время возврата
}
else {
for (byte i = 0; i < 2; i++) { //Перебор количества датчиков
ds.reset();
ds.select(addr[i]);
ds.write(0xBE); //Считывание значения с датчика
int temp = (ds.read() | ds.read() << 8); //Принимаем два байта температуры
Temp[i] = (float)temp / 16.0;
}
if (sensor.read(1)) {
pressure = sensor.pressure; //Данные давления ВМР
int pressbmp = pressure + 0.49;//Округляем и обрасываем дробную часть
tapePressure = utf8rus((String) + pressbmp + "мм"); //Подготовка строки для печати
//temp_bmp280 = sensor.temperature;
} //Данные температуры ВМР
else { } //Здесь можно добавить ошибку ВМР
float dhtHum = dht.readHumidity(); //Влажность с DHT
float dhtTemp = dht.readTemperature(); //Температура с DHT
if (isnan(dhtHum) || isnan(dhtTemp)) { //Ошибка DHT
}
else {
//Формирование строки для DHT
tapeTempHum = utf8rus((String) + dhtTemp + char(128) + "C " + dhtHum + "%");
}
flagDallRead = 10000; //Время возврата
}
}
}
//--------------------------------------------------
void mem(byte index, byte num) {
char buff[45] = "";
if (num == 0) {
strcpy_P(buff, (PGM_P)pgm_read_word(&(str_mon[index-1])));
slTape = buff;
}
if (num == 1) {
strcpy_P(buff, (PGM_P)pgm_read_word(&(str_day[index-1])));
slTape = buff;
}
/*
if (num == 2) {
strcpy_P(buff, (PGM_P)pgm_read_word(&(str_hol[index-1])));
slTape = buff;
}
*/
}
//------------------------------------------------------------
//***********Авария часового модуля*****************
void dataAlarm () {
static boolean alarm = true;
static unsigned long prevTime = 0;
static unsigned long prevTime_1 = 0;
if (flagDataAlarm && alarm) {
alarm = false;
clearMatrix(); //Очистить матрицы
matrix.shutdown(true); //Матрицы в сон
}
if (flagDataAlarm) {
if (millis() - prevTime > 5000) {
prevTime = millis();
beep (20, 3);
}
if (millis() - prevTime_1 > 500) {
prevTime_1 = millis();
digitalWrite (led1, !digitalRead(led1));
digitalWrite (led2, !digitalRead(led2));
digitalWrite (led3, !digitalRead(led3));
}
}
}
//----------------------------------------------------
//**********Считывание времени***********************
void readTime() {
static boolean razd = true;
static byte oldSecund = 0;
byte index = 1;
dataTime = rtc.getTime(); //Строка времени от модуля
hours = dataTime.hour; //Часы
minute = dataTime.min; //Минуты
if (dataTime.year < 2017 || dataTime.year > 2050) {
flagDataAlarm = true;
}
else { flagDataAlarm = false; }
index = dataTime.mon;
mem(index, 0);
tape = slTape;
index = dataTime.dow;
mem(index, 1);
tapeDate = ((String) + dataTime.date + " " + tape + "." + slTape);
if (dataTime.sec != oldSecund){ //Смена секунды
oldSecund = dataTime.sec;
holiday();
razd = ! razd; //Инверсия разделителя
if (razd) {
//Подготовка строк на печать
tapeTime = ((String) + (dataTime.hour/10) + (dataTime.hour%10) + ":" +(dataTime.min/10) + (dataTime.min%10));
}
else {
tapeTime = ((String) + (dataTime.hour/10) + (dataTime.hour%10) + " " +(dataTime.min/10) + (dataTime.min%10));
}
//Здесь вызов отображения времени
}
}
//-----------------------------------------------------
//**********Определение праздничных дат****************
//Возвращаемое значение - номер ячейки массива
void holiday() {
flagHoliday = false;
/*
byte index = 1;
if (dataTime.mon == 1 && dataTime.date == 1) {
flagHoliday = true; index = 1;
mem (index, 2);}
//tapeHol = utf8rus((String) + "C Новым годом");}
if (dataTime.mon == 1 && dataTime.date == 7) {
flagHoliday = true; index = 2;
mem (index, 2);}
//tapeHol = utf8rus((String) + "C Рождеством");}
if (dataTime.mon == 1 && dataTime.date == 27) {
flagHoliday = true; index = 3;
mem (index, 2);}
//tapeHol = utf8rus((String) + "C Днем снятия блокады");}
if (dataTime.mon == 2 && dataTime.date == 23) {
flagHoliday = true; index = 4;
mem (index, 2);}
//tapeHol = utf8rus((String) + "C Днем защитника Отечества");}
if (dataTime.mon == 3 && dataTime.date == 8) {
flagHoliday = true; index = 5;
mem (index, 2);}
//tapeHol = utf8rus((String) + "C Международным женским днем");}
if (dataTime.mon == 4 && dataTime.date == 12) {
flagHoliday = true; index = 6;
mem (index, 2);}
//tapeHol = utf8rus((String) + "C Днем космонавтики");}
if (dataTime.mon == 5 && dataTime.date == 1) {
flagHoliday = true; index = 7;
mem (index, 2);}
//tapeHol = utf8rus((String) + "С Праздником Весны и Труда");}
if (dataTime.mon == 5 && dataTime.date == 9) {
flagHoliday = true; index = 8;
mem (index, 2);}
//tapeHol = utf8rus((String) + "С ДНЕМ ПОБЕДЫ");}
if (dataTime.mon == 6 && dataTime.date == 12) {
flagHoliday = true; index = 9;
mem (index, 2);}
//tapeHol = utf8rus((String) + "С Днем России");}
if (dataTime.mon == 9 && dataTime.date == 1) {
flagHoliday = true; index = 10;
mem (index, 2);}
//tapeHol = utf8rus((String) + "С Днем знаний");}
if (dataTime.mon == 11 && dataTime.date == 4) {
flagHoliday = true; index = 11;
mem (index, 2);}
//tapeHol = utf8rus((String) + "С Днем народного единства");}
if (dataTime.mon == 11 && dataTime.date == 7) {
flagHoliday = true; index = 12;
Serial.println("HOLIDEY");
mem (index, 2);}
//tapeHol = utf8rus((String) + "С Днем согласия и примирения");}
if (dataTime.mon == 12 && dataTime.date == 12) {
flagHoliday = true; index = 13;
mem (index, 2);}
//tapeHol = utf8rus((String) + "С Днем Конституции");}
//tapeHol = utf8rus ((String) + "С " + slTape);
*/
}
//------------------------------------------------------
//**********Статичное отображение************
void staticText (String tape) {
int x = (matrix.width() + 2 - (tape.length() * width)) / 2; //выравнивание по центру X
//int y = (matrix.height() - 8) / 2; //выравнивание по центру Y
int y = 0; //Для однострочной матрицы
matrix.fillScreen(LOW);
for ( int i = 0 ; i < tape.length(); i++ ) {
matrix.drawChar(x, y, tape[i], HIGH, LOW, 1);
x += width;
}
matrix.write(); // отправка данных на дисплей
}
//-----------------------------------------------------------------
//***********Динамическое отображение**********
void dinamicText (String tape, int wait) {
for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ )
{
ledBlink(1000);
analogTumbler();
light();
alarm();
matrix.fillScreen(LOW);
int letter = i / width; // номер символа выводимого на матрицу
int x = (matrix.width() - 1) - i % width;
//int y = (matrix.height() - 8) / 2; // center the text vertically
int y = 0;
while ( x + width - spacer >= 0 && letter >= 0 ) {
if ( letter < tape.length() ) {
matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1);
}
letter--;
x -= width;
}
matrix.write(); // Send bitmap to display
delay(wait);
}
}
//----------------------------------------------------------
//********Время работы табло****************************
void timeWork() {
//Флаг разрешения отображения
static boolean flagTimeWork = true;
//Флаг времени отображения рекламы
static boolean flagTimeReklama = true;
if (flagDataAlarm ) {return;} //Уходим, если авария
//Определяем время отключения до полуночи
if ((hours * 60 + minute) >= 1320 && (hours * 60 + minute) <= 1439) {
//Проверяем флаг разрешения отображения
if (flagTimeWork ) {
clearMatrix(); //Очищаем матрицы
matrix.shutdown(true); //Матрицы в сон
flagTimeWork = false; //Флаг отображения сброшен
}
}
//Определяем время выключения после полуночи
if ((hours * 60 + minute) >= 0 && (hours * 60 + minute) < 360) {
//Проверяем флаг разрешения отображения
if (flagTimeWork ) { //Если разрешено
clearMatrix(); //Очистить матрицы
matrix.shutdown(true); //Матрицы в сон
flagTimeWork = false; //Флаг отображения сброшен
}
}
//Проверяем разрешенное время работы матриц
if ((hours * 60 + minute) >= 360 && (hours * 60 + minute) < 1320) {
//Если флаг разрешения отображения сброшен
if (flagTimeWork == false) {
matrix.shutdown(false); //Матрицы из сна
clearMatrix(); //Очистить матрицы
flagTimeWork = true; //Флаг разрешения отображения поднят
}
}
if ((hours * 60 + minute) > 420 && (hours * 60 + minute) < 1170) {
flagTimeReklama = true;
}
else {
flagTimeReklama = false;
}
if (flagTimeWork ) { //Если флаг отображения поднят
timeVisual(flagTimeReklama); //на функцию выбора и паузы экранов
printVisual(); //На функцию вывода на матрицы
}
}
//----------------------------------------------------------
//**********Очистка матриц*******************************
void clearMatrix() {
tape = " "; //В строке пробел
dinamicText(tape, 1); //На функцию динамического отображения
}
//----------------------------------------------------------
//********Период отображения ***************************
void timeVisual(boolean flag) {
static unsigned long prevTime = 0;
if (millis() - prevTime > 5000) { //Если прошло более 5 секунд
prevTime = millis(); // Обновить время
win++; //Увеличить номер экрана
//Если запрет рекламы по времени или ручной
if (tumbler < 1 && win > 3 ) {
win = 0; //Вернуться к начальным экранам
}
if (flag == false && win > 3) {
win = 0;
}
if (win > 5) { //Максимальное ограничение
win = 0;
}
}
}
//-------------------------------------------------------
//*********Формирование строки**************************
void formStr() {
if (win == 4) {
tape = utf8rus(str_1);
}
if (win == 5) {
if (tumbler == 1) {
tape = utf8rus((String) + str_4 + str_3 + str_5 + char(188));
}
if (tumbler == 2) {
tape = utf8rus((String) + str_2 + str_4 + str_5 + char(188));
}
if (tumbler == 3) {
tape = utf8rus((String) + str_4 + str_5 + char(188));
}
}
}
//-------------------------------------------------------
//**********Печать на матрицу***************************
void printVisual() {
if (win == 0) { //Определение номеров экранов и присвоение строк
tape = tapeTime;
}
if (win == 1) {
tape = utf8rus(tapeDate);
}
if (win == 2) {
if (flagHoliday == false) {win++;}
else { tape = tapeHol; }
}
if (win == 3) {
tape = tapePressure;
}
if (win == 4) {
formStr();
} //На функцию формирования строки
if (win == 5) {
formStr();
}
if (win == 0 || win == 3 || win == 4) { //Для статичных экранов
if (tape != oldTape) { //Если старая строка не равна новой
oldTape = tape; //Обновить старую строку
matrix.setIntensity(matIntensiv); //Обновить яркость
staticText (tape); //На функцию статической печати
}
}
if (win == 1 || win == 2 || win == 5) {
int wait = 0;
//if (tape != oldTape) {
//oldTape = tape;
if (win == 1 || win == 2) {
wait =30; }
if (win == 5) {
wait = 30; }
matrix.setIntensity(matIntensiv);
dinamicText(tape, wait); // На функцию динамической печати
//}
}
}
//--------------------------------------------------------
//***********Пищало******************
void beep(byte period, byte cikl) {
for (byte i = 0; i < cikl; i++) {
digitalWrite(buz, HIGH);
delay(period);
digitalWrite(buz, LOW);
delay(period);
}
}
//--------------------------------------------------------
//**********Авария*******************
void alarm() {
float alarm = max(Temp[0], Temp[1]); //Определение максимальной температуры
//Если превышает и флаг аварии сброеш
if (alarm > ustavka && flagAlarm == 0) {
flagAlarm = 1; //Поднять флаг аварии
tempAlarm = alarm; //запомнить аварийную температуру
}
//Если температура ниже аварийной и флаг аварии поднят
if (alarm < ustavka - gister && flagAlarm == 1) {
flagAlarm = 0; //Сбросить флаг аварии
}
if (flagAlarm == 1) { //Если флаг аварии поднят, немного попищим
static unsigned long prevTime = 0;
if (millis() - prevTime > 5000) {
prevTime = millis();
beep (20, 2);
}
counterAlarm (60000); //На функци контроля аварии
}
}
//----------------------------------------------------------
//**********Счетчики для аварии****************
void counterAlarm(unsigned long interval) {
static unsigned long prevTime = 0;
if (millis() - prevTime > interval) {
prevTime = millis();
//Если предыдущая температура меньше текущей
if (tempAlarm <= max(Temp[0], Temp[1])) {
matIntensiv = matIntensiv - 1; //Снизить яркость
if (matIntensiv > 15) {
matIntensiv = 0; //Переход через ноль
}
}
//Если предыдущая температура меньше текущей
if (tempAlarm > max (Temp[0], Temp[1])) {
tempAlarm = max (Temp[0], Temp[1]); //Запомнить новую
}
}
}
//------------------------------------------------------
//***********Включение светиков*************************
void leds(boolean a, boolean b, boolean c) {
//Здесь накосячил с распайкой, скорректированы программно
digitalWrite (led1, b);
digitalWrite (led2, c);
digitalWrite (led3, a);
}
//********Считывание тумблеров**************************
byte analogTumbler() {
static unsigned long prevTime = 0;
if (millis() - prevTime > 500) { //Задержка опроса
prevTime = millis();
int val = analogRead(A1); //Получить и декодировать значения
if (val < 150) {
leds(LOW, LOW, LOW); //Зажечь требуемые светодиоды
tumbler = 0; //Присвоить значение для анализа
}
else if (val < 300) {
leds(LOW, LOW, HIGH);
tumbler = 1;
}
else if (val < 380) {
leds(LOW, LOW, LOW);
tumbler = 0;
}
else if (val < 450) {
leds(LOW, HIGH, HIGH);
tumbler = 3;
}
else if (val < 540) {
leds(LOW, LOW, LOW);
tumbler = 0;
}
else if (val < 580) {
leds(HIGH, HIGH, HIGH);
tumbler = 2;
}
else if (val < 620) {
leds(LOW, LOW, LOW);
tumbler = 0;
}
else {
leds(HIGH, HIGH, HIGH);
tumbler = 2;
}
}
}
//-------------------------------------------------------
//***********Освещенность*****************
void light() {
static unsigned long prevTime = 0;
static byte lightCounter = 0;
static int fotoRez = 0;
if (millis() - prevTime > 1000) { //Таймер опроса
prevTime = millis();
if (fotoRez == 0) { //Если нет предыдущего значения
fotoRez = analogRead(A0); //Присвоить
}
else {
//Обновить и усреднить значение освещенности
fotoRez = (fotoRez + analogRead(A0)) / 2;
lightCounter++ ; //Увеличить счетчик
}
if (lightCounter > 9) { //Достигли максимального счетчика
lightCounter = 0; //Обнулили счетчик
if (flagAlarm != 1) { //Если авария, уходим
int lmin; //Временные переменные минимума и максимума
int lmax;
EEPROM.get(0, lmin); //Сохраненый минимум
EEPROM.get(2, lmax); //Сохраненый максимум
if (lmin > fotoRez) { //Если больше текущего
EEPROM.put(0, fotoRez); //Сохранить новый
lmin = fotoRez; //Обновить
}
if (lmax < fotoRez) { //Если меньше текущего
EEPROM.put(2, fotoRez); //Сохранить новый
lmax = fotoRez; //Обновить
}
//Значения для свечения матрицы
matIntensiv = map(fotoRez, lmin, lmax, 7, 15);
}
fotoRez = 0; //Подготовить к новому усреднению
}
}
}
//-----------------------------------------------------------
//********Принудительный RESET******************************
void userReset() {
static unsigned long prevTime = 0;
if (millis() - prevTime > 3600000) {
if (win == 0) {
while(1);
}
}
}
//-------------------------------------------------------------------
void setup() {
wdt_disable(); //Собаку в будку
Serial.begin(9600);
sensor.begin(); //Инициализация датчика BMP280
rtc.begin(); //Инициализация часов
dht.begin();
//*******НАСТРОЙКА ВЫХОДОВ*******
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led0, OUTPUT);
pinMode(buz, OUTPUT);
//-----------------------------------------------------
//*****Настройка матриц******************
matrix.setIntensity(matIntensiv); // Use a value between 0 and 15 for brightness
matrix.setRotation(matrix.getRotation() + 3); //1 - 90 2 - 180 3 - 270
//-----------------------------------------------------
//********Установка времени, раскомментить*************
//rtc.setDOW(FRIDAY); // Set Day-of-Week to SUNDAY
//rtc.setTime(19, 46, 0); // Set the time to 12:00:00 (24hr format)
//rtc.setDate(4, 6, 2017);
//------------------------------------------------------
wdt_enable(WDTO_4S); //Активация собаки на 4 секунды
}
void loop() {
ledBlink(1000); //На функцию мигания и сброса собаки
dallRead(flagDallRead); //На считывание температуры
readTime(); //Получение времени
dataAlarm();//Сброс часов - тревога
timeWork(); //Время отображения и печать
alarm(); //Проверка на перегрев
analogTumbler(); //Проверка управляющих тумблеров
light(); //Наружная освещенность
userReset();
}
Не лежит душа к Меге, по крайней мере пока, а ЕСПишка в перспективе. Я без фанатизма, для удовольствия занимаюсь. Впихнул в УНО невпихуемое - работает. Однако по прошествии месяца заметил, что кроме часиков, убегающих на 8 мин. вперёд, они же имеют свойство просто "замирать" и датчики погоду уже не показывают. Вполне логично, если всё повесить на УНО, запитать от телефоннной заряди, забить память по самое "нехочу" - всё это будет глучить до безобразия. Заказал на Алишке SD-прицеп, а пока идёт наведу порядок с телевизором, тем более, что под ёлочкой уже ждут "вкусняшки" цифрового ТВ...
Сечас делаю бегущую строку не светодиодной ленте ws2812( https://youtu.be/ERbp9Rb0Wg4 ). Размер строки можно делать разный и цвета менять - жрет правда много, но красота требует жертв.
Подскажите мигающие точки, пожалуйста. Сегодня вновь взялся за свой проект, 8 матриц не слабо глючат, оставил 6 (всё навесной монтаж третий год). Шесть матриц работают хорошо, секунды убрал. Не могу додуматься до мигающих точек, а те которые есть не работают.
P.S. На днях пришли SD-модули. Буду колдовать с календарём и напоминалками...
кто поскажет как увеличить время задержки показа информацыи и как добавить нули к чясам чтоб было 05:03 и дата 07/03/2019
Никто.
В "чясах" время задержки показа "информацыи" никак "ниувиличиваецца".
От проекта зависит. Я начинал с таймера, потом бегущая строка. Теперь время показывает постоянно, а бегущей строкой выводятся календарь и погода через промежутки времени, заданные в программе. При желании код сброшу сюда...
часы отлично выставляются через программу FLprog.
Вытащите эту строку наружу из if-а, внутри которого она сейчас стоит. И проделайте описанные операции: раскомментировать, залить скетч, закомментировать обратно, залить скетч.
Спасибо за совет помогло.
Доброго времени суток! искал нечто похожее, нашел почти то что надо! подскажи как руссифицировать сообщения? Вот что у меня получилось
https://youtu.be/XazS43FvGIo бегущая строка , год спустя
Доброго времени суток!
Собрал часики по теме, всё замечательно работает. Теперь интересует вопрос. Собственно, он уже был задан в посте #32, а в #36 дан ответ. Не силён в программировании, но может кто подскажет, как "прикрутить" ответ в коде. Время 1:7 и правда смотрится не айс, а вот 01:07 будет актуально. И ещё, может кто знает, как убрать последний ноль из погоды (температура и влажность показывает в формате 00,00, а хотелось бы 00,0) и как поставить "+" летом и "-" зимой в показаниях температуры?
Заранее Благодарю!
Добрый день. Подскажите: можно сделать так, что бы бегущая строка включалась и выключалась по времени?
Те. в 10 утра включилась и 15 часов выключилась
есть ардуино ПРО МИНИ, часы времени, матрица и питание
Может быть и нельзя. От распоряжения начальства зависит.
sadman41, а давайте поспорим "можно-нельзя". Устроим срач страниц на пять. Вот viardeo обрадуется, когда придёт :-))))))))))))
sadman41, а давайте поспорим "можно-нельзя". Устроим срач страниц на пять.
Завтра, пожалуйста. И на все выходные...
sadman41, а давайте поспорим "можно-нельзя". Устроим срач страниц на пять. Вот viardeo обрадуется, когда придёт :-))))))))))))
А давайте. Предлагаю начать с формализации понятия "10 часов" и допустимых отклонений данного параметра.
Можно. конечно, и постебаться. А по сути вопросов? Я не силён в программировании и использую опыт специалистов с некоторыми доработками. В далёком дестве в радиокружке на СЮТ это называлось "повторением", т.е. собирали конструкции уже кем-то разработанные. Иногда сам нахожу ответ. покурив тырнет, а иногда и помощь оказывают - мир не без добрых людей :)
P.S. В дополнение к своему посту #55 бросаю видео готового продукта http://yadi.sk/i/0PgpfAisE44sMQ
Доброго времени суток!
Собрал часики по теме, всё замечательно работает. Теперь интересует вопрос. Собственно, он уже был задан в посте #32, а в #36 дан ответ. Не силён в программировании, но может кто подскажет, как "прикрутить" ответ в коде. Время 1:7 и правда смотрится не айс, а вот 01:07 будет актуально.
char buf[6];
sprintf(buf,"%02d:%02d",hour, minutes);
КудаНада.print(buf);
Заранее Благодарю!
if (temperature>0) buf[0]='+';
else if (temperature<0) buf[0]='+';
else buf[0]=' ';
Благодарю!
Доберусь до дома мозг напрягу: кто, кого, куда и как :)
последнее читать как:
Что-то вспоминается...
Первую конструкцию собирал на 7-сегментных индикаторах. Тогда только собрал, "отрегулировал" код и смотрел как зима пришла: температура за бортом с +8 до -12 за пару часов упала...
Со String не работаю (может излишне навертел), но накидал такое:
void setup() { int8_t number; String line; Serial.begin(115200); Serial.println("begin!"); while (true) { number = random(20) - 5; // Смотреть сюда line = "number: " + String((number > 0) ? "+" : "-") + String((number > 10) ? "" : "0") + abs(number); Serial.println(line); delay(1000); } } void loop() {}Сейчас тоже не работаю, пока. Вперспективе хочу собрать информер: часы, календарь, погода и напоминалка бегущей строкой (праздники, дни рождения и прочее)...
Ага, ага... читал я "И будет ласковый дождь" Бредбери.
Все это интересно, пока делаешь...
напоминалка - лишняя.
Может и лишняя, но интересная. Пока памяти хватает....
Остался извечный вопрос: как "прикрутить" два датчика DHT22 к контроллеру? И коды ковырял, и библиотеки кромсал - хоть убей, с одного только датчика показывает или выдаёт ошибку...
напоминалка - лишняя.
А ежели она будет напоминать, что уже пятница и надобывыпить - тогда тоже лишняя?
напоминалка - лишняя.
А ежели она будет напоминать, что уже пятница и надобывыпить - тогда тоже лишняя?
Нинаю, мне такое никада напоминать не надо.
напоминалка - лишняя.
А ежели она будет напоминать, что уже пятница и надобывыпить - тогда тоже лишняя?
Жжёшь :)
Напоминалка, конечно же. вещь интересная и полезная. Вот только у меня тяму хватило прописывать конкретную дату:
if ((month==9) && (dayOfMonth ==9)){znam_den = "День Танкиста";}Такой вариант не совсем удобен, поскольку праздник отмечается ежегодно второе воскресенье сентября. Т.е. каждый год ужно корректировать. Равно как и каждую пятницу...
if ((month==9) && (dayOfMonth ==9)){znam_den = "День Танкиста";}Такой вариант не совсем удобен, поскольку праздник отмечается ежегодно второе воскресенье сентября. Т.е. каждый год ужно корректировать. Равно как и каждую пятницу...
Деда, дык зачем корректировать каждый год?
if ((month==9) && (dayOfWeek == 7) && (dayOfMonth > 7 && dayOfMonth < 15)){znam_den = "День Танкиста";}Навскидку, при условии, что день недели 7 - это воскресенье.
if ((month==9) && (dayOfMonth ==9)){znam_den = "День Танкиста";}Такой вариант не совсем удобен, поскольку праздник отмечается ежегодно второе воскресенье сентября. Т.е. каждый год ужно корректировать. Равно как и каждую пятницу...
Деда, дык зачем корректировать каждый год?
if ((month==9) && (dayOfWeek == 7) && (dayOfMonth > 7 && dayOfMonth < 15)){znam_den = "День Танкиста";}Навскидку, при условии, что день недели 7 - это воскресенье.
эта хрень не моя, я не знаю.
часы, календарь, погода и напоминалка бегущей строкой (праздники, дни рождения и прочее)...
Ну, и корованы опять же ж, куда без них? Как раз джва года на разработку и уйдёт.
Примерно так и делаю...
Собрал, запустил, пока работает покупаю детальки. Года через 1,5 - 2 надоело - разобрал, собрал новое. Итого, промежуток между творческим фанатизмом 1 - 3 года :)
Сейчас у меня код выглядит так...
Всё же матчасть надо подучить, методом тыка не сильно получается свои "хотелки" прикрутить...
// Библиотеки #include <SPI.h> #include <Wire.h> #include <RTClib.h> #include <Adafruit_GFX.h> #include <Max72xxPanel.h> #include <iarduino_DHT.h> #define DS3231_I2C_ADDRESS 0x68 byte decToBcd(byte val){return ( (val/10*16) + (val%10) );} byte bcdToDec(byte val){return ( (val/16*10) + (val%16) );} // Подключение DS1307: SDA - A4, SCL - A5 RTC_DS1307 RTC; // Подключение DHT22 на улице: PIN1 - +5V, PIN2 - 2, PIN4 - GND iarduino_DHT sensor(2); // Подключение матриц: CLK - 13, DIN - 11, CS - 9 int pinCS = 9; // Количество матриц по вертикали и горизонтали int numberOfHorizontalDisplays = 1; int numberOfVerticalDisplays = 8; Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); String tape = ""; // Расстояние между буквами (в точках) int spacer = 1; // Размер шрифта (прописные буквы, в точках) int width = 5 + spacer; // Русификация шрифтов (перекодировка из UTF-8 в Windows-1251) String utf8rus(String source){ int i,k; String target; unsigned char n; char m[2] = {'0', '\0'}; k = source.length(); i = 0; while (i < k) { n = source[i]; i++; if (n >= 0xC0) { switch (n) { case 0xD0: { n = source[i]; i++; if (n == 0x81) {n = 0xA8; break;} if (n >= 0x90 && n <= 0xBF) n = n + 0x30; break;} case 0xD1: { n = source[i]; i++; if (n == 0x91) {n = 0xB8; break;} if (n >= 0x80 && n <= 0x8F) n = n + 0x70; break;} } } m[0] = n; target = target + String(m);} return target;} String Serial_Read() { // Переменная для чтения сериал порта unsigned char c; // Формируемая из символов строка String Serial_string = ""; // Если в сериал порту есть символы while (Serial.available() > 0) { // Чтение символа c = Serial.read(); // Если это конец строки if (c == '\n') { // Возврат строки return Serial_string;} } } void setDateDs3231(byte second, // 0-59 byte minute, // 0-59 byte hour, // 1-23 byte dayOfWeek, // 1-7 byte dayOfMonth, // 1-28/29/30/31 byte month, // 1-12 byte year){ // 0-99 Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); Wire.write(decToBcd(second)); Wire.write(decToBcd(minute)); Wire.write(decToBcd(hour)); Wire.write(decToBcd(dayOfWeek)); Wire.write(decToBcd(dayOfMonth)); Wire.write(decToBcd(month)); Wire.write(decToBcd(year)); Wire.endTransmission();} void getDateDs3231(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year){ Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); *second = bcdToDec(Wire.read() & 0x7f); *minute = bcdToDec(Wire.read()); *hour = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *month = bcdToDec(Wire.read()); *year = bcdToDec(Wire.read());} String znam_den = " "; void setup() { Serial.begin(9600); Wire.begin(); RTC.begin(); if (! RTC.isrunning()) {Serial.println("RTC is NOT running!");} // Задержка для перехода датчика в активное состояние delay(100); // Яркость матриц от 0 до 15 matrix.setIntensity(1); // Направление текста: 1 - 90 гр., 2 - 180 гр., 3 - 270 гр. matrix.setRotation(3);} void loop() { byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; getDateDs3231(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); int8_t TimeDisp[4]; TimeDisp[0] = hour / 10; TimeDisp[1] = hour % 10; TimeDisp[2] = minute / 10; TimeDisp[3] = minute % 10; DateTime now = RTC.now(); // Чтение показаний DS1307 DateTime future (now.unixtime() ); // Чтение показаний датчика DHT22 switch(sensor.read()){} // Знаменательные даты if ((month==9) && (dayOfMonth ==9)){znam_den = "День Танкиста";} // Вывод на матричный дисплей tape = utf8rus((String)+"Сегодня "+future.day()+"."+future.month()+"."+future.year()+" время "+future.hour()+":"+future.minute()+" погода "+sensor.tem +"'C"+" "+sensor.hum+"%"); if (Serial.available()){tape=Serial_Read();} for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ ) {matrix.fillScreen(LOW); // Номер символа, выводимого на матрицу int letter = i / width; int x = (matrix.width() - 1) - i % width; // Центровка текста по вертикали int y = (matrix.height() - 8) / 2; while ( x + width - spacer >= 0 && letter >= 0 ){if ( letter < tape.length() ){matrix.drawChar(x, y, tape[letter], HIGH, LOW,1);} letter--; x -= width;} // Интервал между перемещениями символов matrix.write(); delay(50);} // Вывод на матричный дисплей tape = utf8rus((String)+" "+znam_den); if (Serial.available()){tape=Serial_Read();} for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ ) {matrix.fillScreen(LOW); // Номер символа, выводимого на матрицу int letter = i / width; int x = (matrix.width() - 1) - i % width; // Центровка текста по вертикали int y = (matrix.height() - 8) / 2; while ( x + width - spacer >= 0 && letter >= 0 ){if ( letter < tape.length() ){matrix.drawChar(x, y, tape[letter], HIGH, LOW,1);} letter--;x -= width;} // Интервал между перемещениями символов matrix.write(); delay(50);} }Сталкивался с такой проблемой: вроде код правильный, а отображение идёт либо что попало, либо со сдвигом на одну букву. Одно время даже в Excel набросал себе скрипт, чтобы писать правильный текст. который переводился в неправильный, вставлял в код и матрицы отображали правильный. В конце-концов перепроверил код несколько раз и нашёл ошибку (или лишний знак, или не хватало уж не помню). Исправил и всё встало на свои места...
Доброго времени суток! искал нечто похожее, нашел почти то что надо! подскажи как руссифицировать сообщения? Вот что у меня получилось
Здраствуйте пробовал ваш скетч, идут кубы целиком светящиеся. Видно, что идут какието процессы, включатся-выключатся. Прошу помощи.
https://youtu.be/Awh0leAzRlY собрал строчку со статическими часами ... 8 модулей MAX 7219 и часами DS3231 .
Сейчас тоже не работаю, пока. Вперспективе хочу собрать информер: часы, календарь, погода и напоминалка бегущей строкой (праздники, дни рождения и прочее)...
Тогда надо контроллер Мегу брать или на ЕСПшке собирать . В ардуино нано, уно ... больше нескольких строчек не запихнешь .
контроллер Мегу брать или на ЕСПшке собирать . В ардуино нано, уно ... больше нескольких строчек не запихнешь .
С чего бы то? Флэша там немало+ епром.
контроллер Мегу брать или на ЕСПшке собирать . В ардуино нано, уно ... больше нескольких строчек не запихнешь .
С чего бы то? Флэша там немало+ епром.
Видео в студию !!
Пробовал могократно впихуть побольше... остается место ... проект компилируется-заливается и после первой строки идет сбой. Если отказаться от датчиков - можно больше залить текста. В старом проекте выводится время, дата , показания с трех датчиков температуры и три рандомные фразы общим объемом 130 символов. +еще текст идет с показаниями датчиков .
Так проблема не в нане с уной. Проблема в стрингах, они память засирают. Я пока ричу с керниганом до конца не освоил, проект валяется. Примерно сутки работал, потом вываливался.
#include <SPI.h> #include <Adafruit_GFX.h> #include <Max72xxPanel.h> #include <avr/wdt.h> #include <avr/pgmspace.h> #include <OneWire.h> OneWire ds(9); #include <iarduino_Pressure_BMP.h> iarduino_Pressure_BMP sensor(0x76); //BMP280 по шине I2C #include <DS3231.h> DS3231 rtc(SDA, SCL); #include <EEPROM.h> #include "DHT.h" //****************Инициализация и входы DHT********************** #define DHTPIN 4 // Uncomment whatever type you're using! //#define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) #define DHTTYPE DHT21 // DHT 21 (AM2301) // Connect pin 1 (on the left) of the sensor to +5V // Connect pin 2 of the sensor to whatever your DHTPIN is // Connect pin 4 (on the right) of the sensor to GROUND // Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor DHT dht(DHTPIN, DHTTYPE); //-------------------------------------------------------------------- //******ОБЪЯВЛЕНИЕ ВХОДОВ-ВЫХОДОВ********** const byte led0 = 8; //Светодиод сигнальный const byte led1 = 5; //Светодиод 1 const byte led2 = 6; //Светодиод 2 const byte led3 = 7; //Светодиод 3 const byte buz = 3; //Бузер const byte pinCS = 10; //Пин выбора матриц //--------------------------------------------------------- //*****НАСТРОЙКА и переменные МАТРИЦ**************** const byte numberOfHorizontalDisplays = 1; const byte numberOfVerticalDisplays = 8; Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); String tape = ""; // Строка для отображения String slTape = ""; String oldTape = ""; //Предыдущая отображаемая строка String tapeTime = ""; //Строка времени String tapeDate = ""; //Строка даты String tapePressure = ""; //Строка давления String tapeTempHum = ""; //Строка влажности, температуры String tapeHol = ""; //Строка праздничных дней byte spacer = 2; // Промежуток между символами (кол-во точек) byte width = 5 + spacer; // Ширина символа byte win; // Номер экрана byte matIntensiv = 2; // Переменная яркости экрана boolean flagHoliday = false; //Флаг праздника //---------------------------------------------------- //******Переменные Далласов*************************** byte addr[2] [8] = {{0x28, 0xFF, 0x80, 0x95, 0x72, 0x15, 0x03, 0xB2}, {0x28, 0xFF, 0x4E, 0xE1, 0x72, 0x15, 0x03, 0x94}}; float Temp[2]; int flagDallRead; boolean flagAlarm; float tempAlarm; float ustavka = 50.0; float gister = 3.0; //---------------------------------------------------- //*******Переменные барометра************************* float pressure; // float temp_bmp280; //----------------------------------------------------- //*******Переменные для часов************************** Time dataTime; byte hours; byte minute; boolean flagDataAlarm = true; //Флаг некорректной даты-времени //--------------------------------------- //*******Аналоговые переменные************ byte tumbler; //---------------------------------------- //*******Строковые константы************* const char* str_1 = "ПЕРЕПЕЛА"; const char* str_2 = "ЯЙЦО,"; const char* str_3 = " с 10 до 18"; const char* str_4 = "МОЛОДНЯК,КЛЕТКИ"; const char* str_5 = ".ВХОД С ПЕРЕУЛКА."; const char day_1[] PROGMEM = "Понедельник"; const char day_2[] PROGMEM = "Вторник"; const char day_3[] PROGMEM = "Среда"; const char day_4[] PROGMEM = "Четверг"; const char day_5[] PROGMEM = "Пятница"; const char day_6[] PROGMEM = "Суббота"; const char day_7[] PROGMEM = "Воскресенье"; const char* const str_day[] PROGMEM = {day_1, day_2, day_3, day_4, day_5, day_6, day_7}; const char mon_1[] PROGMEM = "Января"; const char mon_2[] PROGMEM = "Февраля"; const char mon_3[] PROGMEM = "Марта"; const char mon_4[] PROGMEM = "Апреля"; const char mon_5[] PROGMEM = "Мая"; const char mon_6[] PROGMEM = "Июня"; const char mon_7[] PROGMEM = "Июля"; const char mon_8[] PROGMEM = "Августа"; const char mon_9[] PROGMEM = "Сентября"; const char mon_10[] PROGMEM = "Октября"; const char mon_11[] PROGMEM = "Ноября"; const char mon_12[] PROGMEM = "Декабря"; const char* const str_mon[] PROGMEM = {mon_1, mon_2, mon_3, mon_4, mon_5, mon_6, mon_7, mon_8, mon_9, mon_10, mon_11, mon_12}; /* const char hol_1[] PROGMEM = "Новым годом"; const char hol_2[] PROGMEM = "Рождеством"; const char hol_3[] PROGMEM = "Днем снятия блокады"; const char hol_4[] PROGMEM = "Днем защитника Отечества"; const char hol_5[] PROGMEM = "Международным женским днем"; const char hol_6[] PROGMEM = "Днем космонавтики"; const char hol_7[] PROGMEM = "Праздником Весны и Труда"; const char hol_8[] PROGMEM = "ДНЕМ ПОБЕДЫ"; const char hol_9[] PROGMEM = "Днем России"; const char hol_10[] PROGMEM = "Днем знаний"; const char hol_11[] PROGMEM = "Днем народного единства"; const char hol_12[] PROGMEM = "Днем согласия и примирения"; const char hol_13[] PROGMEM = "Днем Конституции"; const char* const str_hol[] PROGMEM = {hol_1, hol_2, hol_3, hol_4, hol_5, hol_6, hol_7, hol_8, hol_9, hol_10, hol_11, hol_12, hol_13}; */ //----------------------------------------- //********ФУНКЦИИ*********** //****Декодирование в русские символы***** String utf8rus(String source) { int i, k; String target; unsigned char n; char m[2] = { '0', '\0' }; k = source.length(); i = 0; while (i < k) { n = source[i]; i++; if (n >= 0xC0) { switch (n) { case 0xD0: { n = source[i]; i++; if (n == 0x81) { n = 0xA8; break; } if (n >= 0x90 && n <= 0xBF) n = n + 0x2F; break; } case 0xD1: { n = source[i]; i++; if (n == 0x91) { n = 0xB7; break; } if (n >= 0x80 && n <= 0x8F) n = n + 0x6F; break; } } } m[0] = n; target = target + String(m); } return target; } //------------------------------------------------------------- //******Мигалка и WDT*************************** void ledBlink(unsigned long interval) { static unsigned long prevTime = 0; if (millis() - prevTime > interval) { prevTime = millis(); digitalWrite(led0, !digitalRead(led0));//Инвертируем светик wdt_reset(); //Команда "Фу" } } //------------------------------------------------------------- //***Функция считывания температуры c Далласов***** void dallRead(unsigned long interval) { static unsigned long prevTime = 0; if (millis() - prevTime > interval) { //Проверка заданного интервала static boolean flagDall = 0; //Признак операции prevTime = millis(); flagDall = ! flagDall; //Инверсия признака if (flagDall) { ds.reset(); ds.write(0xCC); //Обращение ко всем датчикам ds.write(0x44); //Команда на конвертацию flagDallRead = 750; //Время возврата } else { for (byte i = 0; i < 2; i++) { //Перебор количества датчиков ds.reset(); ds.select(addr[i]); ds.write(0xBE); //Считывание значения с датчика int temp = (ds.read() | ds.read() << 8); //Принимаем два байта температуры Temp[i] = (float)temp / 16.0; } if (sensor.read(1)) { pressure = sensor.pressure; //Данные давления ВМР int pressbmp = pressure + 0.49;//Округляем и обрасываем дробную часть tapePressure = utf8rus((String) + pressbmp + "мм"); //Подготовка строки для печати //temp_bmp280 = sensor.temperature; } //Данные температуры ВМР else { } //Здесь можно добавить ошибку ВМР float dhtHum = dht.readHumidity(); //Влажность с DHT float dhtTemp = dht.readTemperature(); //Температура с DHT if (isnan(dhtHum) || isnan(dhtTemp)) { //Ошибка DHT } else { //Формирование строки для DHT tapeTempHum = utf8rus((String) + dhtTemp + char(128) + "C " + dhtHum + "%"); } flagDallRead = 10000; //Время возврата } } } //-------------------------------------------------- void mem(byte index, byte num) { char buff[45] = ""; if (num == 0) { strcpy_P(buff, (PGM_P)pgm_read_word(&(str_mon[index-1]))); slTape = buff; } if (num == 1) { strcpy_P(buff, (PGM_P)pgm_read_word(&(str_day[index-1]))); slTape = buff; } /* if (num == 2) { strcpy_P(buff, (PGM_P)pgm_read_word(&(str_hol[index-1]))); slTape = buff; } */ } //------------------------------------------------------------ //***********Авария часового модуля***************** void dataAlarm () { static boolean alarm = true; static unsigned long prevTime = 0; static unsigned long prevTime_1 = 0; if (flagDataAlarm && alarm) { alarm = false; clearMatrix(); //Очистить матрицы matrix.shutdown(true); //Матрицы в сон } if (flagDataAlarm) { if (millis() - prevTime > 5000) { prevTime = millis(); beep (20, 3); } if (millis() - prevTime_1 > 500) { prevTime_1 = millis(); digitalWrite (led1, !digitalRead(led1)); digitalWrite (led2, !digitalRead(led2)); digitalWrite (led3, !digitalRead(led3)); } } } //---------------------------------------------------- //**********Считывание времени*********************** void readTime() { static boolean razd = true; static byte oldSecund = 0; byte index = 1; dataTime = rtc.getTime(); //Строка времени от модуля hours = dataTime.hour; //Часы minute = dataTime.min; //Минуты if (dataTime.year < 2017 || dataTime.year > 2050) { flagDataAlarm = true; } else { flagDataAlarm = false; } index = dataTime.mon; mem(index, 0); tape = slTape; index = dataTime.dow; mem(index, 1); tapeDate = ((String) + dataTime.date + " " + tape + "." + slTape); if (dataTime.sec != oldSecund){ //Смена секунды oldSecund = dataTime.sec; holiday(); razd = ! razd; //Инверсия разделителя if (razd) { //Подготовка строк на печать tapeTime = ((String) + (dataTime.hour/10) + (dataTime.hour%10) + ":" +(dataTime.min/10) + (dataTime.min%10)); } else { tapeTime = ((String) + (dataTime.hour/10) + (dataTime.hour%10) + " " +(dataTime.min/10) + (dataTime.min%10)); } //Здесь вызов отображения времени } } //----------------------------------------------------- //**********Определение праздничных дат**************** //Возвращаемое значение - номер ячейки массива void holiday() { flagHoliday = false; /* byte index = 1; if (dataTime.mon == 1 && dataTime.date == 1) { flagHoliday = true; index = 1; mem (index, 2);} //tapeHol = utf8rus((String) + "C Новым годом");} if (dataTime.mon == 1 && dataTime.date == 7) { flagHoliday = true; index = 2; mem (index, 2);} //tapeHol = utf8rus((String) + "C Рождеством");} if (dataTime.mon == 1 && dataTime.date == 27) { flagHoliday = true; index = 3; mem (index, 2);} //tapeHol = utf8rus((String) + "C Днем снятия блокады");} if (dataTime.mon == 2 && dataTime.date == 23) { flagHoliday = true; index = 4; mem (index, 2);} //tapeHol = utf8rus((String) + "C Днем защитника Отечества");} if (dataTime.mon == 3 && dataTime.date == 8) { flagHoliday = true; index = 5; mem (index, 2);} //tapeHol = utf8rus((String) + "C Международным женским днем");} if (dataTime.mon == 4 && dataTime.date == 12) { flagHoliday = true; index = 6; mem (index, 2);} //tapeHol = utf8rus((String) + "C Днем космонавтики");} if (dataTime.mon == 5 && dataTime.date == 1) { flagHoliday = true; index = 7; mem (index, 2);} //tapeHol = utf8rus((String) + "С Праздником Весны и Труда");} if (dataTime.mon == 5 && dataTime.date == 9) { flagHoliday = true; index = 8; mem (index, 2);} //tapeHol = utf8rus((String) + "С ДНЕМ ПОБЕДЫ");} if (dataTime.mon == 6 && dataTime.date == 12) { flagHoliday = true; index = 9; mem (index, 2);} //tapeHol = utf8rus((String) + "С Днем России");} if (dataTime.mon == 9 && dataTime.date == 1) { flagHoliday = true; index = 10; mem (index, 2);} //tapeHol = utf8rus((String) + "С Днем знаний");} if (dataTime.mon == 11 && dataTime.date == 4) { flagHoliday = true; index = 11; mem (index, 2);} //tapeHol = utf8rus((String) + "С Днем народного единства");} if (dataTime.mon == 11 && dataTime.date == 7) { flagHoliday = true; index = 12; Serial.println("HOLIDEY"); mem (index, 2);} //tapeHol = utf8rus((String) + "С Днем согласия и примирения");} if (dataTime.mon == 12 && dataTime.date == 12) { flagHoliday = true; index = 13; mem (index, 2);} //tapeHol = utf8rus((String) + "С Днем Конституции");} //tapeHol = utf8rus ((String) + "С " + slTape); */ } //------------------------------------------------------ //**********Статичное отображение************ void staticText (String tape) { int x = (matrix.width() + 2 - (tape.length() * width)) / 2; //выравнивание по центру X //int y = (matrix.height() - 8) / 2; //выравнивание по центру Y int y = 0; //Для однострочной матрицы matrix.fillScreen(LOW); for ( int i = 0 ; i < tape.length(); i++ ) { matrix.drawChar(x, y, tape[i], HIGH, LOW, 1); x += width; } matrix.write(); // отправка данных на дисплей } //----------------------------------------------------------------- //***********Динамическое отображение********** void dinamicText (String tape, int wait) { for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ ) { ledBlink(1000); analogTumbler(); light(); alarm(); matrix.fillScreen(LOW); int letter = i / width; // номер символа выводимого на матрицу int x = (matrix.width() - 1) - i % width; //int y = (matrix.height() - 8) / 2; // center the text vertically int y = 0; while ( x + width - spacer >= 0 && letter >= 0 ) { if ( letter < tape.length() ) { matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1); } letter--; x -= width; } matrix.write(); // Send bitmap to display delay(wait); } } //---------------------------------------------------------- //********Время работы табло**************************** void timeWork() { //Флаг разрешения отображения static boolean flagTimeWork = true; //Флаг времени отображения рекламы static boolean flagTimeReklama = true; if (flagDataAlarm ) {return;} //Уходим, если авария //Определяем время отключения до полуночи if ((hours * 60 + minute) >= 1320 && (hours * 60 + minute) <= 1439) { //Проверяем флаг разрешения отображения if (flagTimeWork ) { clearMatrix(); //Очищаем матрицы matrix.shutdown(true); //Матрицы в сон flagTimeWork = false; //Флаг отображения сброшен } } //Определяем время выключения после полуночи if ((hours * 60 + minute) >= 0 && (hours * 60 + minute) < 360) { //Проверяем флаг разрешения отображения if (flagTimeWork ) { //Если разрешено clearMatrix(); //Очистить матрицы matrix.shutdown(true); //Матрицы в сон flagTimeWork = false; //Флаг отображения сброшен } } //Проверяем разрешенное время работы матриц if ((hours * 60 + minute) >= 360 && (hours * 60 + minute) < 1320) { //Если флаг разрешения отображения сброшен if (flagTimeWork == false) { matrix.shutdown(false); //Матрицы из сна clearMatrix(); //Очистить матрицы flagTimeWork = true; //Флаг разрешения отображения поднят } } if ((hours * 60 + minute) > 420 && (hours * 60 + minute) < 1170) { flagTimeReklama = true; } else { flagTimeReklama = false; } if (flagTimeWork ) { //Если флаг отображения поднят timeVisual(flagTimeReklama); //на функцию выбора и паузы экранов printVisual(); //На функцию вывода на матрицы } } //---------------------------------------------------------- //**********Очистка матриц******************************* void clearMatrix() { tape = " "; //В строке пробел dinamicText(tape, 1); //На функцию динамического отображения } //---------------------------------------------------------- //********Период отображения *************************** void timeVisual(boolean flag) { static unsigned long prevTime = 0; if (millis() - prevTime > 5000) { //Если прошло более 5 секунд prevTime = millis(); // Обновить время win++; //Увеличить номер экрана //Если запрет рекламы по времени или ручной if (tumbler < 1 && win > 3 ) { win = 0; //Вернуться к начальным экранам } if (flag == false && win > 3) { win = 0; } if (win > 5) { //Максимальное ограничение win = 0; } } } //------------------------------------------------------- //*********Формирование строки************************** void formStr() { if (win == 4) { tape = utf8rus(str_1); } if (win == 5) { if (tumbler == 1) { tape = utf8rus((String) + str_4 + str_3 + str_5 + char(188)); } if (tumbler == 2) { tape = utf8rus((String) + str_2 + str_4 + str_5 + char(188)); } if (tumbler == 3) { tape = utf8rus((String) + str_4 + str_5 + char(188)); } } } //------------------------------------------------------- //**********Печать на матрицу*************************** void printVisual() { if (win == 0) { //Определение номеров экранов и присвоение строк tape = tapeTime; } if (win == 1) { tape = utf8rus(tapeDate); } if (win == 2) { if (flagHoliday == false) {win++;} else { tape = tapeHol; } } if (win == 3) { tape = tapePressure; } if (win == 4) { formStr(); } //На функцию формирования строки if (win == 5) { formStr(); } if (win == 0 || win == 3 || win == 4) { //Для статичных экранов if (tape != oldTape) { //Если старая строка не равна новой oldTape = tape; //Обновить старую строку matrix.setIntensity(matIntensiv); //Обновить яркость staticText (tape); //На функцию статической печати } } if (win == 1 || win == 2 || win == 5) { int wait = 0; //if (tape != oldTape) { //oldTape = tape; if (win == 1 || win == 2) { wait =30; } if (win == 5) { wait = 30; } matrix.setIntensity(matIntensiv); dinamicText(tape, wait); // На функцию динамической печати //} } } //-------------------------------------------------------- //***********Пищало****************** void beep(byte period, byte cikl) { for (byte i = 0; i < cikl; i++) { digitalWrite(buz, HIGH); delay(period); digitalWrite(buz, LOW); delay(period); } } //-------------------------------------------------------- //**********Авария******************* void alarm() { float alarm = max(Temp[0], Temp[1]); //Определение максимальной температуры //Если превышает и флаг аварии сброеш if (alarm > ustavka && flagAlarm == 0) { flagAlarm = 1; //Поднять флаг аварии tempAlarm = alarm; //запомнить аварийную температуру } //Если температура ниже аварийной и флаг аварии поднят if (alarm < ustavka - gister && flagAlarm == 1) { flagAlarm = 0; //Сбросить флаг аварии } if (flagAlarm == 1) { //Если флаг аварии поднят, немного попищим static unsigned long prevTime = 0; if (millis() - prevTime > 5000) { prevTime = millis(); beep (20, 2); } counterAlarm (60000); //На функци контроля аварии } } //---------------------------------------------------------- //**********Счетчики для аварии**************** void counterAlarm(unsigned long interval) { static unsigned long prevTime = 0; if (millis() - prevTime > interval) { prevTime = millis(); //Если предыдущая температура меньше текущей if (tempAlarm <= max(Temp[0], Temp[1])) { matIntensiv = matIntensiv - 1; //Снизить яркость if (matIntensiv > 15) { matIntensiv = 0; //Переход через ноль } } //Если предыдущая температура меньше текущей if (tempAlarm > max (Temp[0], Temp[1])) { tempAlarm = max (Temp[0], Temp[1]); //Запомнить новую } } } //------------------------------------------------------ //***********Включение светиков************************* void leds(boolean a, boolean b, boolean c) { //Здесь накосячил с распайкой, скорректированы программно digitalWrite (led1, b); digitalWrite (led2, c); digitalWrite (led3, a); } //********Считывание тумблеров************************** byte analogTumbler() { static unsigned long prevTime = 0; if (millis() - prevTime > 500) { //Задержка опроса prevTime = millis(); int val = analogRead(A1); //Получить и декодировать значения if (val < 150) { leds(LOW, LOW, LOW); //Зажечь требуемые светодиоды tumbler = 0; //Присвоить значение для анализа } else if (val < 300) { leds(LOW, LOW, HIGH); tumbler = 1; } else if (val < 380) { leds(LOW, LOW, LOW); tumbler = 0; } else if (val < 450) { leds(LOW, HIGH, HIGH); tumbler = 3; } else if (val < 540) { leds(LOW, LOW, LOW); tumbler = 0; } else if (val < 580) { leds(HIGH, HIGH, HIGH); tumbler = 2; } else if (val < 620) { leds(LOW, LOW, LOW); tumbler = 0; } else { leds(HIGH, HIGH, HIGH); tumbler = 2; } } } //------------------------------------------------------- //***********Освещенность***************** void light() { static unsigned long prevTime = 0; static byte lightCounter = 0; static int fotoRez = 0; if (millis() - prevTime > 1000) { //Таймер опроса prevTime = millis(); if (fotoRez == 0) { //Если нет предыдущего значения fotoRez = analogRead(A0); //Присвоить } else { //Обновить и усреднить значение освещенности fotoRez = (fotoRez + analogRead(A0)) / 2; lightCounter++ ; //Увеличить счетчик } if (lightCounter > 9) { //Достигли максимального счетчика lightCounter = 0; //Обнулили счетчик if (flagAlarm != 1) { //Если авария, уходим int lmin; //Временные переменные минимума и максимума int lmax; EEPROM.get(0, lmin); //Сохраненый минимум EEPROM.get(2, lmax); //Сохраненый максимум if (lmin > fotoRez) { //Если больше текущего EEPROM.put(0, fotoRez); //Сохранить новый lmin = fotoRez; //Обновить } if (lmax < fotoRez) { //Если меньше текущего EEPROM.put(2, fotoRez); //Сохранить новый lmax = fotoRez; //Обновить } //Значения для свечения матрицы matIntensiv = map(fotoRez, lmin, lmax, 7, 15); } fotoRez = 0; //Подготовить к новому усреднению } } } //----------------------------------------------------------- //********Принудительный RESET****************************** void userReset() { static unsigned long prevTime = 0; if (millis() - prevTime > 3600000) { if (win == 0) { while(1); } } } //------------------------------------------------------------------- void setup() { wdt_disable(); //Собаку в будку Serial.begin(9600); sensor.begin(); //Инициализация датчика BMP280 rtc.begin(); //Инициализация часов dht.begin(); //*******НАСТРОЙКА ВЫХОДОВ******* pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(led0, OUTPUT); pinMode(buz, OUTPUT); //----------------------------------------------------- //*****Настройка матриц****************** matrix.setIntensity(matIntensiv); // Use a value between 0 and 15 for brightness matrix.setRotation(matrix.getRotation() + 3); //1 - 90 2 - 180 3 - 270 //----------------------------------------------------- //********Установка времени, раскомментить************* //rtc.setDOW(FRIDAY); // Set Day-of-Week to SUNDAY //rtc.setTime(19, 46, 0); // Set the time to 12:00:00 (24hr format) //rtc.setDate(4, 6, 2017); //------------------------------------------------------ wdt_enable(WDTO_4S); //Активация собаки на 4 секунды } void loop() { ledBlink(1000); //На функцию мигания и сброса собаки dallRead(flagDallRead); //На считывание температуры readTime(); //Получение времени dataAlarm();//Сброс часов - тревога timeWork(); //Время отображения и печать alarm(); //Проверка на перегрев analogTumbler(); //Проверка управляющих тумблеров light(); //Наружная освещенность userReset(); }Не лежит душа к Меге, по крайней мере пока, а ЕСПишка в перспективе. Я без фанатизма, для удовольствия занимаюсь. Впихнул в УНО невпихуемое - работает. Однако по прошествии месяца заметил, что кроме часиков, убегающих на 8 мин. вперёд, они же имеют свойство просто "замирать" и датчики погоду уже не показывают. Вполне логично, если всё повесить на УНО, запитать от телефоннной заряди, забить память по самое "нехочу" - всё это будет глучить до безобразия. Заказал на Алишке SD-прицеп, а пока идёт наведу порядок с телевизором, тем более, что под ёлочкой уже ждут "вкусняшки" цифрового ТВ...
часы 1307 ???
Сечас делаю бегущую строку не светодиодной ленте ws2812( https://youtu.be/ERbp9Rb0Wg4 ). Размер строки можно делать разный и цвета менять - жрет правда много, но красота требует жертв.
всем привет собрал чясики не могу настроить Русский текст
в чем причина
собрал чясики не могу настроить Русский текст
в чем причина
В том, что это "чясики". В "чясиках" русский текст не настраивается.
собрал чясики не могу настроить Русский текст
в чем причина
В том, что это "чясики". В "чясиках" русский текст не настраивается.
ХЗ, что там за видео. Может там и не "чясики" вовсе.
в чем причина
в библиотеке.
кто поскажет как увеличить время задержки показа информацыи и как добавить нули к чясам чтоб было 05:03 и дата 07/03/2019
кто поскажет как увеличить время задержки показа информацыи и как добавить нули к чясам чтоб было 05:03 и дата 07/03/2019
Никто.
В "чясах" время задержки показа "информацыи" никак "ниувиличиваецца".
https://youtu.be/Awh0leAzRlY собрал строчку со статическими часами ... 8 модулей MAX 7219 и часами DS3231 .
Подскажите мигающие точки, пожалуйста. Сегодня вновь взялся за свой проект, 8 матриц не слабо глючат, оставил 6 (всё навесной монтаж третий год). Шесть матриц работают хорошо, секунды убрал. Не могу додуматься до мигающих точек, а те которые есть не работают.
P.S. На днях пришли SD-модули. Буду колдовать с календарём и напоминалками...
кто поскажет как увеличить время задержки показа информацыи и как добавить нули к чясам чтоб было 05:03 и дата 07/03/2019
Никто.
В "чясах" время задержки показа "информацыи" никак "ниувиличиваецца".
От проекта зависит. Я начинал с таймера, потом бегущая строка. Теперь время показывает постоянно, а бегущей строкой выводятся календарь и погода через промежутки времени, заданные в программе. При желании код сброшу сюда...
всем привет собрал чясики не могу настроить Русский текст
В "чясиках" руского действительно нет, а влажность и температура - это уже не часики. Для них русификатор надо прописывать...