светодиодная матрица на MAX7219 базе Max72xxPanel создаем бегущую строку с помощью переменных.

Ardo23
Offline
Зарегистрирован: 29.12.2016

часы отлично выставляются через программу FLprog. 

maximys
Offline
Зарегистрирован: 02.12.2015

kalapanga пишет:

maximys пишет:
Когда я заливаю скетч которий должен отображать дату время температуру и влажность но дата изначально стоит 2000 01 01 и время 0 00 так вот время и дата должни отображатса текущие тоесть настольние часи но етого непроисходить. Так понятно или нет.

Вытащите эту строку наружу из if-а, внутри которого она сейчас стоит. И проделайте описанные операции: раскомментировать, залить скетч, закомментировать обратно, залить скетч.

Спасибо за совет помогло.

AngelNT
Offline
Зарегистрирован: 05.05.2018

Доброго времени суток! искал нечто похожее, нашел почти то что надо! подскажи как руссифицировать сообщения? Вот что у меня получилось 

#include "SFE_BMP180.h"
#include "Wire.h"
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
//***************
//#include <iarduino_DHT.h>   // подключаем библиотеку для работы с датчиком DHT
//iarduino_DHT sensor(2);     // объявляем  переменную для работы с датчиком DHT, указывая номер цифрового вывода к которому подключён датчик (сейчас 2pin)
SFE_BMP180 BMP180Sensor;
//***************
int pinCS = 10; // DIN 11, CLK 13 
int numberOfHorizontalDisplays = 1;//КОЛИЧЕСТВО МАТРИЦ ВЕРТИКАЛЬНО
int numberOfVerticalDisplays = 6;//КОЛИЧЕСТВО МАТРИЦ ГОРИЗОНТАЛЬНО MAX7219 8х8х4
 
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
 
String tape = "";
int wait = 30; // время в миллисекундах
 
int spacer = 2; // Промежуток между символами (кол-во точек)
int width = 5 + spacer; // Ширина шрифта 5 пикселей
 
/* Перекодировать русские шрифты из 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 + 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;
}
 
String Serial_Read() {
  unsigned char c; // переменная для чтения сериал порта
  String Serial_string = ""; // Формируемая из символов строка
  while (Serial.available() > 0) { // Если в сериал порту есть символы
    c = Serial.read(); // Читаем символ
    //Serial.print(c,HEX); Serial.print(" "); Serial.print(c);
    if (c == '\n') {  // Если это конец строки
          return Serial_string; // Возвращаем строку 
    }
 
    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 для яркости
 matrix.setRotation(matrix.getRotation()+3); //развернуть строку 1 - 90, 2 - 180, 3 - 270
 BMP180Sensor.begin();
}
void loop() {
   char status;
  double T, P, tCelsius, tPressure;
 
  //Начинаем измерения температуры
  //функция startTemperature() возвращает количество миллисекунд
  //с начала процесса измерения, если процесс измерения прошел правильно,
  //сохраним это значение в переменную status
  //Если функция возвращает 0 то процесс измерения прошел неправильно
  status = BMP180Sensor.startTemperature();
  if(status != 0)
  {
    //Подождать то самое количество миллисекунд 
    delay(status);
    //Получить замеренное и обработанное значение температуры
    //в градусах Цельсия, и сохранить в переменной Т
    //функция getTemperature() возвращает 1 если вызов её
    //прошел успешно, и 0 если функция не смогла инициализировать 
    //переменную Т измеренным значением
    status = BMP180Sensor.getTemperature(T);
    if(status != 0)
    {
      tCelsius = T;
   }
 // }
      status = BMP180Sensor.startPressure(3);
            if (status != 0){
                // ожидание замера давления
                delay(status);
                status = BMP180Sensor.getPressure(P,T);
               if (status != 0){
                 tPressure = P*0.7500637554192,2;
                }
            }
BMP180Sensor.startTemperature();    // читаем показания датчика
 Serial.println((String) " ");
 
  }
  // сдесь в зависимости от перменых на матрицу выводится нужная строка
 
tape = (mesyc +"Temperature: "+tCelsius +"`C "+"Pressure: "+tPressure+" Rt.St");
 
 
 
  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(wait);
  }
 //delay(2000);
}
 
 
 
 
 
 
tape = (mesyc +"Temperature: "+tCelsius +"`C "+"Pressure: "+tPressure+" Rt.St"); в этой строке если указать, как у тебя в исходнике, utf8rus - получается абра кадабра! ЧТО НЕ ТАК?
Ardo23
Offline
Зарегистрирован: 29.12.2016

https://youtu.be/XazS43FvGIo   бегущая строка , год спустя 

Toropizhka
Toropizhka аватар
Offline
Зарегистрирован: 27.08.2018

Доброго времени суток!

Собрал часики по теме, всё замечательно работает. Теперь интересует вопрос. Собственно, он уже был задан в посте #32, а в #36 дан ответ. Не силён в программировании, но может кто подскажет, как "прикрутить" ответ в коде. Время 1:7 и правда смотрится не айс, а вот 01:07 будет актуально. И ещё, может кто знает, как убрать последний ноль из погоды (температура и влажность показывает в формате 00,00, а хотелось бы 00,0) и как поставить "+" летом и "-" зимой в показаниях температуры?

Заранее Благодарю!

viardeo
Offline
Зарегистрирован: 04.10.2018

Добрый день. Подскажите: можно сделать так, что бы бегущая строка включалась и выключалась по времени?

Те. в 10 утра включилась и 15 часов выключилась

есть ардуино ПРО МИНИ, часы времени, матрица и питание

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

viardeo пишет:
Подскажите: можно сделать так, что бы бегущая строка включалась и выключалась по времени?
Можно.

sadman41
Offline
Зарегистрирован: 19.10.2016

Может быть и нельзя. От распоряжения начальства зависит.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41, а давайте поспорим "можно-нельзя". Устроим срач страниц на пять. Вот viardeo обрадуется, когда придёт :-))))))))))))

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

ЕвгенийП пишет:

sadman41, а давайте поспорим "можно-нельзя". Устроим срач страниц на пять. 

Завтра, пожалуйста.  И на все выходные...

 

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП пишет:

sadman41, а давайте поспорим "можно-нельзя". Устроим срач страниц на пять. Вот viardeo обрадуется, когда придёт :-))))))))))))

А давайте. Предлагаю начать с формализации понятия "10 часов" и допустимых отклонений данного параметра. 

Toropizhka
Toropizhka аватар
Offline
Зарегистрирован: 27.08.2018

Можно. конечно, и постебаться. А по сути вопросов? Я не силён в программировании и использую опыт специалистов с некоторыми доработками. В далёком дестве в радиокружке на СЮТ это называлось "повторением", т.е. собирали конструкции уже кем-то разработанные. Иногда сам нахожу ответ. покурив тырнет, а иногда и помощь оказывают - мир не без добрых людей :)

P.S. В дополнение к своему посту #55 бросаю видео готового продукта http://yadi.sk/i/0PgpfAisE44sMQ

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Toropizhka пишет:

Доброго времени суток!

Собрал часики по теме, всё замечательно работает. Теперь интересует вопрос. Собственно, он уже был задан в посте #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 пишет:

и как поставить "+" летом и "-" зимой в показаниях температуры?

Заранее Благодарю!

 

if (temperature>0) buf[0]='+';

else if (temperature<0) buf[0]='+';

else buf[0]=' ';

 

Toropizhka
Toropizhka аватар
Offline
Зарегистрирован: 27.08.2018

Благодарю!

Доберусь до дома мозг напрягу: кто, кого, куда и как :)

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

последнее читать как: 

if (temperature>0) buf[0]='+';

else if (temperature<0) buf[0]='-';

else buf[0]=' ';

 

 

Toropizhka
Toropizhka аватар
Offline
Зарегистрирован: 27.08.2018

Что-то вспоминается...

Первую конструкцию собирал на 7-сегментных индикаторах. Тогда только собрал, "отрегулировал" код и смотрел как зима пришла: температура за бортом с +8 до -12 за пару часов упала...

sadman41
Offline
Зарегистрирован: 19.10.2016

Со 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() {}

 

Toropizhka
Toropizhka аватар
Offline
Зарегистрирован: 27.08.2018

Сейчас тоже не работаю, пока. Вперспективе хочу собрать информер: часы, календарь, погода и напоминалка бегущей строкой (праздники, дни рождения и прочее)...

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Ага, ага... читал я "И будет ласковый дождь" Бредбери.

Все это интересно, пока делаешь...

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

напоминалка - лишняя.

Toropizhka
Toropizhka аватар
Offline
Зарегистрирован: 27.08.2018

Может и лишняя, но интересная. Пока памяти хватает....

Остался извечный вопрос: как "прикрутить" два датчика DHT22 к контроллеру? И коды ковырял, и библиотеки кромсал - хоть убей, с одного только датчика показывает или выдаёт ошибку...

sadman41
Offline
Зарегистрирован: 19.10.2016

DetSimen пишет:

напоминалка - лишняя.

А ежели она будет напоминать, что уже пятница и надобывыпить - тогда тоже лишняя?

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

sadman41 пишет:

DetSimen пишет:

напоминалка - лишняя.

А ежели она будет напоминать, что уже пятница и надобывыпить - тогда тоже лишняя?

Нинаю, мне такое никада напоминать не надо.

Toropizhka
Toropizhka аватар
Offline
Зарегистрирован: 27.08.2018

sadman41 пишет:

DetSimen пишет:

напоминалка - лишняя.

А ежели она будет напоминать, что уже пятница и надобывыпить - тогда тоже лишняя?

Жжёшь :)

Напоминалка, конечно же. вещь интересная и полезная. Вот только у меня тяму хватило прописывать конкретную дату:

if ((month==9)  && (dayOfMonth ==9)){znam_den = "День Танкиста";}

Такой вариант не совсем удобен, поскольку праздник отмечается ежегодно второе воскресенье сентября. Т.е. каждый год ужно корректировать. Равно как и каждую пятницу...

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Toropizhka пишет:

if ((month==9)  && (dayOfMonth ==9)){znam_den = "День Танкиста";}

Такой вариант не совсем удобен, поскольку праздник отмечается ежегодно второе воскресенье сентября. Т.е. каждый год ужно корректировать. Равно как и каждую пятницу...

Деда, дык зачем корректировать каждый год?

if ((month==9)  && (dayOfWeek == 7) && (dayOfMonth > 7 && dayOfMonth < 15)){znam_den = "День Танкиста";}

Навскидку, при условии, что день недели 7 - это воскресенье.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

DIYMan пишет:

Toropizhka пишет:

if ((month==9)  && (dayOfMonth ==9)){znam_den = "День Танкиста";}

Такой вариант не совсем удобен, поскольку праздник отмечается ежегодно второе воскресенье сентября. Т.е. каждый год ужно корректировать. Равно как и каждую пятницу...

Деда, дык зачем корректировать каждый год?

if ((month==9)  && (dayOfWeek == 7) && (dayOfMonth > 7 && dayOfMonth < 15)){znam_den = "День Танкиста";}

Навскидку, при условии, что день недели 7 - это воскресенье.

эта хрень не моя, я не знаю. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Toropizhka пишет:

часы, календарь, погода и напоминалка бегущей строкой (праздники, дни рождения и прочее)...

Ну, и корованы опять же ж, куда без них? Как раз джва года на разработку и уйдёт.

Toropizhka
Toropizhka аватар
Offline
Зарегистрирован: 27.08.2018

Примерно так и делаю...

Собрал, запустил, пока работает покупаю детальки. Года через 1,5 - 2 надоело - разобрал, собрал новое. Итого, промежуток между творческим фанатизмом 1 - 3 года :)

Toropizhka
Toropizhka аватар
Offline
Зарегистрирован: 27.08.2018

Сейчас у меня код выглядит так...

Всё же матчасть надо подучить, методом тыка не сильно получается свои "хотелки" прикрутить...

// Библиотеки
#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);}
}

 

Toropizhka
Toropizhka аватар
Offline
Зарегистрирован: 27.08.2018

Сталкивался с такой проблемой: вроде код правильный, а отображение идёт либо что попало, либо со сдвигом на одну букву. Одно время даже в Excel набросал себе скрипт, чтобы писать правильный текст. который переводился в неправильный, вставлял в код и матрицы отображали правильный. В конце-концов перепроверил код несколько раз и нашёл ошибку (или лишний знак, или не хватало уж не помню). Исправил и всё встало на свои места...

Toropizhka
Toropizhka аватар
Offline
Зарегистрирован: 27.08.2018

AngelNT пишет:

Доброго времени суток! искал нечто похожее, нашел почти то что надо! подскажи как руссифицировать сообщения? Вот что у меня получилось 

 
Посмотри #79, там весь код. Проверь всё касаемо русификации, может тоже найдёшь проблему. Кстати, первое время, по неопытности, коды писал-редактировал в Word, а потом тупо копировал и вставлял в Arduino IDE. В итоге часто ишибки выбивало...
BUGEL
Offline
Зарегистрирован: 19.12.2018

Здраствуйте пробовал ваш скетч, идут кубы целиком светящиеся. Видно, что идут какието процессы, включатся-выключатся. Прошу помощи.

Ardo23
Offline
Зарегистрирован: 29.12.2016

https://youtu.be/Awh0leAzRlY    собрал строчку со статическими часами ... 8 модулей MAX 7219 и часами DS3231 . 

Ardo23
Offline
Зарегистрирован: 29.12.2016

Toropizhka пишет:

Сейчас тоже не работаю, пока. Вперспективе хочу собрать информер: часы, календарь, погода и напоминалка бегущей строкой (праздники, дни рождения и прочее)...

 

Тогда надо контроллер Мегу брать или на ЕСПшке собирать . В ардуино нано, уно ... больше нескольких строчек не запихнешь . 

bwn
Offline
Зарегистрирован: 25.08.2014

Ardo23 пишет:

контроллер Мегу брать или на ЕСПшке собирать . В ардуино нано, уно ... больше нескольких строчек не запихнешь . 

С чего бы то? Флэша там немало+ епром. 

Ardo23
Offline
Зарегистрирован: 29.12.2016

bwn пишет:

Ardo23 пишет:

контроллер Мегу брать или на ЕСПшке собирать . В ардуино нано, уно ... больше нескольких строчек не запихнешь . 

С чего бы то? Флэша там немало+ епром. 

Видео в студию !!

Пробовал могократно впихуть побольше... остается место ... проект компилируется-заливается и после первой строки идет сбой. Если отказаться от датчиков - можно больше залить текста. В старом проекте выводится время, дата , показания с трех датчиков температуры и три рандомные фразы общим объемом 130 символов. +еще текст идет с показаниями датчиков . 

bwn
Offline
Зарегистрирован: 25.08.2014

Так проблема не в нане с уной. Проблема в стрингах, они память засирают. Я пока ричу с керниганом до конца не освоил, проект валяется. Примерно сутки работал, потом вываливался.


#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();
}

 

Toropizhka
Toropizhka аватар
Offline
Зарегистрирован: 27.08.2018

Не лежит душа к Меге, по крайней мере пока, а ЕСПишка в перспективе. Я без фанатизма, для удовольствия занимаюсь. Впихнул в УНО невпихуемое - работает. Однако по прошествии месяца заметил, что кроме часиков, убегающих на 8 мин. вперёд, они же имеют свойство просто "замирать" и датчики погоду уже не показывают. Вполне логично, если всё повесить на УНО, запитать от телефоннной заряди, забить память по самое "нехочу" - всё это будет глучить до безобразия. Заказал на Алишке SD-прицеп, а пока идёт наведу порядок с телевизором, тем более, что под ёлочкой уже ждут "вкусняшки" цифрового ТВ...

Ardo23
Offline
Зарегистрирован: 29.12.2016

часы 1307 ???

Сечас делаю бегущую строку не светодиодной ленте ws2812( https://youtu.be/ERbp9Rb0Wg4 ). Размер строки можно делать разный и цвета менять - жрет правда много, но красота требует жертв. 

герой
Offline
Зарегистрирован: 24.02.2019

всем привет собрал чясики не могу настроить Русский текст 

герой
Offline
Зарегистрирован: 24.02.2019

в чем причина 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

герой пишет:

собрал чясики не могу настроить Русский текст

в чем причина 

В том, что это "чясики". В "чясиках" русский текст не настраивается.

герой
Offline
Зарегистрирован: 24.02.2019

ЕвгенийП пишет:

герой пишет:

собрал чясики не могу настроить Русский текст

в чем причина 

В том, что это "чясики". В "чясиках" русский текст не настраивается.

но на видео влажность дата температура на русском 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ХЗ, что там за видео. Может там и не "чясики" вовсе.

Ardo23
Offline
Зарегистрирован: 29.12.2016

герой пишет:

в чем причина 

в библиотеке. 

герой
Offline
Зарегистрирован: 24.02.2019

кто поскажет как увеличить время задержки показа информацыи и как добавить нули к чясам чтоб было 05:03 и дата 07/03/2019

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

герой пишет:

кто поскажет как увеличить время задержки показа информацыи и как добавить нули к чясам чтоб было 05:03 и дата 07/03/2019

Никто.

В "чясах" время задержки показа "информацыи" никак "ниувиличиваецца".

Toropizhka
Toropizhka аватар
Offline
Зарегистрирован: 27.08.2018

Ardo23 пишет:

https://youtu.be/Awh0leAzRlY    собрал строчку со статическими часами ... 8 модулей MAX 7219 и часами DS3231 . 

Подскажите мигающие точки, пожалуйста. Сегодня вновь взялся за свой проект, 8 матриц не слабо глючат, оставил 6 (всё навесной монтаж третий год). Шесть матриц работают хорошо, секунды убрал. Не могу додуматься до мигающих точек, а те которые есть не работают.

P.S. На днях пришли SD-модули. Буду колдовать с календарём и напоминалками...

Toropizhka
Toropizhka аватар
Offline
Зарегистрирован: 27.08.2018

Ворота пишет:

герой пишет:

кто поскажет как увеличить время задержки показа информацыи и как добавить нули к чясам чтоб было 05:03 и дата 07/03/2019

Никто.

В "чясах" время задержки показа "информацыи" никак "ниувиличиваецца".

От проекта зависит. Я начинал с таймера, потом бегущая строка. Теперь время показывает постоянно, а бегущей строкой выводятся календарь и погода через промежутки времени, заданные в программе. При желании код сброшу сюда...

Toropizhka
Toropizhka аватар
Offline
Зарегистрирован: 27.08.2018

герой пишет:

всем привет собрал чясики не могу настроить Русский текст 

В "чясиках" руского действительно нет, а влажность и температура - это уже не часики. Для них русификатор надо прописывать...