Когда я заливаю скетч которий должен отображать дату время температуру и влажность но дата изначально стоит 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 не работаю (может излишне навертел), но накидал такое:
Сейчас тоже не работаю, пока. Вперспективе хочу собрать информер: часы, календарь, погода и напоминалка бегущей строкой (праздники, дни рождения и прочее)...
Ага, ага... читал я "И будет ласковый дождь" Бредбери.
Все это интересно, пока делаешь...
напоминалка - лишняя.
Может и лишняя, но интересная. Пока памяти хватает....
Остался извечный вопрос: как "прикрутить" два датчика DHT22 к контроллеру? И коды ковырял, и библиотеки кромсал - хоть убей, с одного только датчика показывает или выдаёт ошибку...
напоминалка - лишняя.
А ежели она будет напоминать, что уже пятница и надобывыпить - тогда тоже лишняя?
напоминалка - лишняя.
А ежели она будет напоминать, что уже пятница и надобывыпить - тогда тоже лишняя?
Нинаю, мне такое никада напоминать не надо.
напоминалка - лишняя.
А ежели она будет напоминать, что уже пятница и надобывыпить - тогда тоже лишняя?
Жжёшь :)
Напоминалка, конечно же. вещь интересная и полезная. Вот только у меня тяму хватило прописывать конкретную дату:
Такой вариант не совсем удобен, поскольку праздник отмечается ежегодно второе воскресенье сентября. Т.е. каждый год ужно корректировать. Равно как и каждую пятницу...
Такой вариант не совсем удобен, поскольку праздник отмечается ежегодно второе воскресенье сентября. Т.е. каждый год ужно корректировать. Равно как и каждую пятницу...
Деда, дык зачем корректировать каждый год?
Навскидку, при условии, что день недели 7 - это воскресенье.
Такой вариант не совсем удобен, поскольку праздник отмечается ежегодно второе воскресенье сентября. Т.е. каждый год ужно корректировать. Равно как и каждую пятницу...
Деда, дык зачем корректировать каждый год?
Навскидку, при условии, что день недели 7 - это воскресенье.
эта хрень не моя, я не знаю.
часы, календарь, погода и напоминалка бегущей строкой (праздники, дни рождения и прочее)...
Ну, и корованы опять же ж, куда без них? Как раз джва года на разработку и уйдёт.
Примерно так и делаю...
Собрал, запустил, пока работает покупаю детальки. Года через 1,5 - 2 надоело - разобрал, собрал новое. Итого, промежуток между творческим фанатизмом 1 - 3 года :)
Сейчас у меня код выглядит так...
Всё же матчасть надо подучить, методом тыка не сильно получается свои "хотелки" прикрутить...
Сталкивался с такой проблемой: вроде код правильный, а отображение идёт либо что попало, либо со сдвигом на одну букву. Одно время даже в Excel набросал себе скрипт, чтобы писать правильный текст. который переводился в неправильный, вставлял в код и матрицы отображали правильный. В конце-концов перепроверил код несколько раз и нашёл ошибку (или лишний знак, или не хватало уж не помню). Исправил и всё встало на свои места...
Доброго времени суток! искал нечто похожее, нашел почти то что надо! подскажи как руссифицировать сообщения? Вот что у меня получилось
Здраствуйте пробовал ваш скетч, идут кубы целиком светящиеся. Видно, что идут какието процессы, включатся-выключатся. Прошу помощи.
https://youtu.be/Awh0leAzRlY собрал строчку со статическими часами ... 8 модулей MAX 7219 и часами DS3231 .
Сейчас тоже не работаю, пока. Вперспективе хочу собрать информер: часы, календарь, погода и напоминалка бегущей строкой (праздники, дни рождения и прочее)...
Тогда надо контроллер Мегу брать или на ЕСПшке собирать . В ардуино нано, уно ... больше нескольких строчек не запихнешь .
контроллер Мегу брать или на ЕСПшке собирать . В ардуино нано, уно ... больше нескольких строчек не запихнешь .
С чего бы то? Флэша там немало+ епром.
контроллер Мегу брать или на ЕСПшке собирать . В ардуино нано, уно ... больше нескольких строчек не запихнешь .
С чего бы то? Флэша там немало+ епром.
Видео в студию !!
Пробовал могократно впихуть побольше... остается место ... проект компилируется-заливается и после первой строки идет сбой. Если отказаться от датчиков - можно больше залить текста. В старом проекте выводится время, дата , показания с трех датчиков температуры и три рандомные фразы общим объемом 130 символов. +еще текст идет с показаниями датчиков .
Так проблема не в нане с уной. Проблема в стрингах, они память засирают. Я пока ричу с керниганом до конца не освоил, проект валяется. Примерно сутки работал, потом вываливался.
Не лежит душа к Меге, по крайней мере пока, а ЕСПишка в перспективе. Я без фанатизма, для удовольствия занимаюсь. Впихнул в УНО невпихуемое - работает. Однако по прошествии месяца заметил, что кроме часиков, убегающих на 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
Никто.
В "чясах" время задержки показа "информацыи" никак "ниувиличиваецца".
От проекта зависит. Я начинал с таймера, потом бегущая строка. Теперь время показывает постоянно, а бегущей строкой выводятся календарь и погода через промежутки времени, заданные в программе. При желании код сброшу сюда...
всем привет собрал чясики не могу настроить Русский текст
В "чясиках" руского действительно нет, а влажность и температура - это уже не часики. Для них русификатор надо прописывать...