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

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

сбрось код за ранее благодарю

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

Toropizhka пишет:

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

герой пишет:

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

Никто.

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

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

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

Toropizhka пишет:

Подскажите мигающие точки, пожалуйста.

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

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

герой пишет:

сбрось код за ранее благодарю

Сейчас код такой. Постоянно переписываю, дорабатываю. Русификацию убрал из экономии памяти. Библиотеки лучше брат в оригинале, я свои немного подкорректировал...

// Библиотеки
   #include <SPI.h>
   #include <Wire.h>
   #include <Adafruit_GFX.h>
   #include <Max72xxPanel.h>
   #include <iarduino_DHT.h>
   #include <iarduino_RTC.h>

// Подключение пьезоэлемента: Black - GND, Red - 5
   int soundPin = 5; 
// Подключение матриц, количество по вертикали и горизонтали: CLK - 13, DIN - 11, CS - 9
   int pinCS = 9;
   int numberOfHorizontalDisplays = 1;
   int numberOfVerticalDisplays = 6;
   Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
// Подключение DHT22 на улице и в комнате: PIN1 - +5V, PIN2 - 2(3), PIN4 - GND
   iarduino_DHT sensor1(2);
   iarduino_DHT sensor2(3);
// Подключение DS1307: SDA - A4, SCL - A5
// Объект time для работы с модулем RTC на базе чипа DS1307, аппаратная шина I2C:
   iarduino_RTC time(RTC_DS1307);
// Символ часов
   const byte data[8]={B00111000,B01010100,B10010010,B11110010,B10000010,B01000100,B00111000,B00000000};

   String clocks;
   String weather;
   String calendar;
//====================================================================================
void setup(void)
// Назначение PIN5 режима работы "Выход":
{  pinMode(soundPin, OUTPUT);
// Инициализация модуля RTC DS1307:
   time.begin();
// Яркость матриц (от 0 до 15) и направление текста (1 - 90 гр., 2 - 180 гр., 3 - 270 гр.):
   matrix.setIntensity(1);
   matrix.setRotation(3);
   delay(60000);   
}
//====================================================================================
void loop(void)
{  DisplayData();
   DisplayTime();
// Чтение показаний датчиков DHT22:
   switch(sensor1.read()){}
   switch(sensor2.read()){}
// Звуковое сопровождение каждого часа c 06:00 до 22:00 на 0-й секунде в течение 5-и секунд:
   if(((time.Hours==6 || time.Hours==7 || time.Hours==8 || time.Hours==9 || time.Hours==10 || time.Hours==11 || time.Hours==12 || time.Hours==13 || time.Hours==14 || time.Hours==15 || time.Hours==16 || time.Hours==17 || time.Hours==18 || time.Hours==19 || time.Hours==20 || time.Hours==21 || time.Hours==22) && time.minutes==0) && time.seconds==0) {
   analogWrite(soundPin, 255); delay(500); analogWrite(soundPin, 0); delay(500);
   analogWrite(soundPin, 255); delay(500); analogWrite(soundPin, 0); delay(500);
   analogWrite(soundPin, 255); delay(500); analogWrite(soundPin, 0); delay(500);
   analogWrite(soundPin, 255); delay(500); analogWrite(soundPin, 0); delay(500);
   analogWrite(soundPin, 255); delay(500); analogWrite(soundPin, 0); delay(500);}
// Запуск бегущей строки каждые 5 минут на 0-й секунде и запись показаний температуры/влажности в бегущую строку:
   if((time.minutes==4 || time.minutes==9 || time.minutes==14 || time.minutes==19 || time.minutes==24 || time.minutes==29 || time.minutes==34 || time.minutes==39 || time.minutes==44 || time.minutes==49 || time.minutes==54) && time.seconds==0)
   {ScrollText(weather);}
// Запуск бегущей строки каждые 15 минут на 0-й секунде и запись календаря в бегущую строку:
   if((time.minutes==5 || time.minutes==15 || time.minutes==30 || time.minutes==45) && time.seconds==0)
   {ScrollText(calendar);}
}
//====================================================================================
void ScrollText (String text)
  // Скорость бегущей строки:
{  int wait = 50;
// Центровка данных по вертикали:
   int y = (matrix.height() - 8) / 2;
// Расстояние между буквами (в точках) и размер шрифта (прописные буквы, в точках):
   int spacer = 1;
   int width = 5 + spacer;
   int refresh=0;
   for (int i = 0 ; i < width * text.length() + matrix.width() - 1 - spacer; i++)
   {if (refresh==1) i=0; refresh=0;
   matrix.fillScreen(LOW);
   int letter = i / width;
   int x = (matrix.width() - 1) - i % width;
   while (x + width - spacer >= 0 && letter >= 0)
   {if (letter < text.length())
   {matrix.drawChar(x, y, text[letter], HIGH, LOW, 1);}
   letter--; x -= width;}
// Вывод бегущей строки на дисплей:
   matrix.write();
   delay(wait);}
}
//====================================================================================
void DisplayData()
// Формирование показаний календаря  в бегущей строке:
{  calendar = ((String)+time.gettime("d.m.Y"));
// Формирование показаний температуры и влажности в бегущей строке:
   weather  = ((String)+"{ "+sensor1.tem+"'C" +"   } "+sensor1.hum+"%"+"   | "+sensor2.tem+"'C" +"   } "+sensor2.hum+"%");
}
//====================================================================================
void DisplayTime()
// Очистка матрицы   
{  matrix.fillScreen(LOW);
// Формирование символа часов и вывод на дисплей:
   for ( int y = 0; y < 8; y++ ) {for ( int x = 0; x < 8; x++ ) {matrix.drawPixel(x, y, data[y] & (1<<x));}}
// Получение и вывод текущего времени:
   clocks = String(time.gettime("Hi"));
// Положение текущего времени по горизонтали:
   int xh = 19;
   int xi = 36;
// Центровка текущего времени по вертикали:
   int y = (matrix.height() - 8) / 2;
// Отображение двоеточия между часами и минутами по центру:
   matrix.drawChar(31, y, (String(":"))[0], HIGH, LOW, 1);
// Формирование показаний текущего времени и вывод на дисплей:
   matrix.drawChar(xh, y, clocks[0], HIGH, LOW, 1);
   matrix.drawChar(xh+6, y, clocks[1], HIGH, LOW, 1);
   matrix.drawChar(xi, y, clocks[2], HIGH, LOW, 1);
   matrix.drawChar(xi+6, y, clocks[3], HIGH, LOW, 1);
   matrix.write();
}

 

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

Ardo23 пишет:

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

Наслышан, читал, но пока не добрался. В режиме таймера нормально точки мигали. Сечас с часиками и "стрингами" намаялся, последние и правда память сильно вешают, датчики иногда зависают и приходится перезагрузку делать...

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

благодарю работает отлично такой вопрос как сдвинуть чясы в лево и добавить секунды и (температура в доме **** влажность ***  на уличе ****  дата ****  и на Русском 

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

герой пишет:

благодарю работает отлично такой вопрос как сдвинуть чясы в лево и добавить секунды и (температура в доме **** влажность ***  на уличе ****  дата ****  и на Русском 

Тебе уже двое говорили (я - третий): "чясы" на русском не бывают!!!

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

герой пишет:

благодарю работает отлично такой вопрос как сдвинуть чясы в лево и добавить секунды и (температура в доме **** влажность ***  на уличе ****  дата ****  и на Русском 

Вы вообще удивительный человек! Здесь достаточно почитать тему и "чясики" русскими станут и секунды побегут. А писать для Вас лично коды с Вашими хотелками времени нет, да и желания...

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

Ardo23 пишет:

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

"Покурил" Тырнет и нашёл решение: объявил переменные и заменил строку с двоеточием на мигающие точки

int h, i, s

h = time.Hours();
i = time.minutes();
s = time.seconds();

if(s & 1){matrix.drawChar(31, y, (String(":"))[0], HIGH, LOW, 1);}
else{matrix.drawChar(31, y, (String(" "))[0], HIGH, LOW, 1);}

Двоеточие теперь мигает между часами и минутами ;)

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

Toropizhka пишет:

"Покурил" Тырнет и нашёл решение

отлично. 

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

Toropizhka пишет:

Двоеточие теперь мигает между часами и минутами ;)

Так в том-то и дело. А ТС между "чясами" надо! Ты вот такой найди. Это-то и дурак найдёт.

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

Ardo23 пишет:

отлично. 

Плучил долгожданные SD-приколюшки. Сижу изучаю как перенести часть кода на SD-карту. Попутно решил проблему DS1307. Наслышан про "дезертирство" сего модуля, у меня за неделю время до 12 мин. убегало вперёд. "Залил" точное время, через сутки проверю и выставлю корректировку. Каки прежде, "курю" Тырнет, поскольку углубляться в Datasheet времени физически не хватает...

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

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

Так в том-то и дело. А ТС между "чясами" надо! Ты вот такой найди. Это-то и дурак найдёт.

1. Ху из ТС? Уточните вопрос, плиз...

2. Если дурак нашёл, что же Вы спрашиваете? Сдвинуть влево "чясики" много ума не надо: добавить в коде отоброжение секунд и указать координаты. В #79 у меня было 8 матриц и там был таймер, а в #104 уже DS1307 и 6 матриц. Так что как ни крути, в моём коде двигай не двигай, а секунды просто физически не влезут...

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

Toropizhka, Вы не поняли шутки. Это был троллинг "героя"

"герой" просил сделать "чясы", а Вы нашли про "часы". Т.е. не выполнили его просьбу! Слабо оказалось! А про "часы" - и дурак найдёт :)))))

А ТС - это "топикстартер", но в данном случае это "герой", влезший в чужой топик.

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

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

Toropizhka, Вы не поняли шутки. Это был троллинг "героя"

Спасибо, понял. Ответил тем же, наперёд уже зная ещё кучу вопросов, суть которых сведётся к одному - "Сбрось код, заранее благодарю!". Иногда постебаться полезно)...

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

Действующий "продукт": https://yadi.sk/i/pUokPyuRTwQVbA

"Зонтик" и "капелька" - датчик DHT22 за балконом.

"Домик" и "капелька" - датчик DHT22 в комнате.

Символы переписывал при помощи сервиса http://xantorohara.github.io/led-matrix-editor/#0000000000000000, т.е. заменил в файле c:\Program Files\ArduinoIDE\libraries\Adafruit_GFX\glcdfont.c ненужные символы своими...

b707
Offline
Зарегистрирован: 26.05.2017

Toropizhka пишет:

Плучил долгожданные SD-приколюшки. Сижу изучаю как перенести часть кода на SD-карту.

перенести часть программного кода на СД-карту? - невозможно

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

Toropizhka пишет:

Действующий "продукт": https://yadi.sk/i/pUokPyuRTwQVbA

Красота. Есть ребята делают такие строчки только на ESP8266 c WIFI. Время , погоду, температуру - можно не подключать свои датчики, а брать из сети+ делать настройки с телефона. Время всегда будет точное, но при наличии интернета.  Сейчас начали корпуса делать из фанеры, орг.стекла и кусочка солнцезащитной пленки- смотрится очень необычно.  https://youtu.be/X2Y_R-KwVOo  Можно на ЕСПшку подключить свои датчики - домашние , которых нет в сети - отправлять их в Народный монитор, а уже другой ЕСП брать их из сети и выводить на строку.  Появляется опция- узнай показания своих датчиков в любой точке мира. 

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

Ardo23 пишет:

Красота. Есть ребята делают такие строчки только на ESP8266 c WIFI... 

Спасибо. Читал, смотрел, понравилось. Народный мониторинг стал одной из причин увлечения проектом в принципе. Единственное, что смущало - брать погоду из Сети. У нас в разных районах города может быть разная погода, а данные Сети вообще привязаны к областному центру в 30-и километрах. Поэтому хотелось иметь свои данные. Передать в Народный мониторинг - да хорошая идея, брать погоду из Сети - для меня идея не интересная. Кроме того, есть своя "хотелка" и даже с учётом извечного вопроса "Где взять память?" отказываться от неё не собираюсь. Ответов на разных форумах было масса, от "напоминалка лишняя" до "купи себе метеостанцию и не лечи мозги". У меня есть своя "хотелка" и интерес собрать своими руками, а не убирать лишнее или вовсе покупать готовый продукт. Да, долго. Да, дорого. Но у каждого свои тараканы в голове, мои меня вполне устраивают...

arduinec
Offline
Зарегистрирован: 01.09.2015

Toropizhka пишет:
Сечас с часиками и "стрингами" намаялся, последние и правда память сильно вешают

Вместо String-строк можно использовать char-строки (пост #40): http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...

Toropizhka пишет:
Символы переписывал при помощи сервиса ... т.е. заменил в файле c:\Program Files\ArduinoIDE\libraries\Adafruit_GFX\glcdfont.c ненужные символы своими...

Редактирование символов описано в постах #27 и #31: http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...

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

arduinec пишет:

Вместо String-строк можно использовать char-строки (пост #40): http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...

Редактирование символов описано в постах #27 и #31: http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...

Спасибо, как-то читал. Эта тема в общем мне хорошо помогла при русификации бегущей строки :)...

chekan216
Offline
Зарегистрирован: 02.07.2019

код не рабочий

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

chekan216 пишет:

код не рабочий

Какой код и что именно не работает?

Mr.Inker
Offline
Зарегистрирован: 18.01.2020

Всем привет.

 Max7219 4 сегмента +  Arduino UNO

код не правил подключился как в коде, с английскими символами проблем нет.

glcdfont.c менял на варианты с разных источников, варианты utf8rus, с разными сдвигами тоже все перепробывал.

 

нет ркусского и все =(

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

Mr.Inker пишет:

Max7219 4 сегмента +  Arduino UNO

Лежат в ящике стола каждая в своей коробочке? Скручены вместе синей изолентой? Или собраны по какой-то секретной схеме?

Mr.Inker пишет:

код не правил 

Какой код?

Mr.Inker пишет:

подключился как в коде

В каком?

Mr.Inker пишет:

glcdfont.c 

Это ещё что?

Вы откуда, вообще, выпрыгнули?

Mr.Inker
Offline
Зарегистрирован: 18.01.2020

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

ящике стола каждая в своей коробочке? Скручены вместе синей изолентой? Или собраны по какой-то секретной схеме?

Согласно Datasheet

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

Какой код?

из первого поста

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

В каком?

С коде из первого поста

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

Это ещё что?

Если вы не в курсе что это за файл и зачем он, вы явно не из тех, кто способен мне помочь.

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

Вы откуда, вообще, выпрыгнули?

Из гугла =)

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

Mr.Inker пишет:

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

Это ещё что?

Если вы не в курсе что это за файл и зачем он, вы явно не из тех, кто способен мне помочь.

Замершее сообщество, с интересом смотрит виртуозное исполнение трюка - "наступи себе на яйца".))))

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

Mr.Inker пишет:
вы явно не из тех, кто способен мне помочь.
Вы не представляете, как меня это огорчает. Ну, удачи :-)

Mr.Inker
Offline
Зарегистрирован: 18.01.2020

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

Вы не представляете, как меня это огорчает. Ну, удачи :-)

 

Не хотел вас расстроить, Удачи! =)

Mr.Inker
Offline
Зарегистрирован: 18.01.2020

И снова здравствуйте.

Уф, разобрался, и хоть вежливость в этом топике не очень котируется, но вдруг кто-то столкнется с подобным, и ему мое решение пригодится =)

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

Оказалось все банально. У меня была уставновлена библиотека Adafruit_GFX аж два раза =)

Первый в "документы/Arduino/libraries", второй в папке самого "Arduino IDE/libraries", при этом я заменял glcdfont.c  только в одной из них, а компилятор подтягивал другую.

в общем грохнул библиотеку Adafruit_GFX в "документы/Arduino/libraries", убедился, что glcdfont.c с русскими буквами там где должен, и все заработало.

В общем не за что.

Удачи всем )

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

НАЛИВАЙ!!!! Самый лучший вариант когда сам разобрался и понял что дело было не бабине ....  Еще поразило утверждение что русского языка не бывает , при том что куча видео с русскими буквами. 

Mr.Inker
Offline
Зарегистрирован: 18.01.2020

Ardo23 пишет:

НАЛИВАЙ!!!! Самый лучший вариант когда сам разобрался и понял что дело было не бабине ....  Еще поразило утверждение что русского языка не бывает , при том что куча видео с русскими буквами. 

А Налью! Хоть и не люблю пить с хамоватыми организмами'c =)

Жахнули, а теперь можно поговорить "по душам":

Ты в глаза долбишься или при рождении уроненый? Где я утверждал, что русского языка нет? Я просил помощи с тем, что русский не работает у меня. Да, набирал с телефона и получилось кривовато =). А в ответ получил стеб и хамство, а хамам я больше одного, максимум двух раз не отвечаю ;)

Кстати, в твоем сообщении тоже явные проблемы с русский языком, тебе бы тоже библиотеки не помешало бы подтянуть) 

 

PS какой "unfriendly", к новичкам, форум .. Пойду у Гайвера зарегистрируюсь, это будет ЛЕГЕН .. (wait for it)..

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Mr.Inker пишет:
PS какой "unfriendly", к новичкам, форум .. Пойду у Гайвера зарегистрируюсь, это будет ЛЕГЕН .. (wait for it).
Во-во. Каждая регистрация на разных форумах дает +1 в статику к вашему персу.Чем больше регистраций на разных форумов, тем больше гарантия получить крит при использовании навыка. 

ПС: В обучении не важен характер учителя, а важно умение научиться от ученика. Вот с желанием учиться у теперешнего народа туго.

Mr.Inker
Offline
Зарегистрирован: 18.01.2020

qwone пишет:

Mr.Inker пишет:
PS какой "unfriendly", к новичкам, форум .. Пойду у Гайвера зарегистрируюсь, это будет ЛЕГЕН .. (wait for it).
Во-во. Каждая регистрация на разных форумах дает +1 в статику к вашему персу.Чем больше регистраций на разных форумов, тем больше гарантия получить крит при использовании навыка. 

ПС: В обучении не важен характер учителя, а важно умение научиться от ученика. Вот с желанием учиться у теперешнего народа туго.

отчасти я с вами согласен.

Конечно, нужно учиться. И любить учиться =)

Но, например, я уже не в том возрасте, что бы  терпеть "говнистость" некоторых персонажей, даже ради новых знаний. Гордость не позволяет. Проще найти другого, адекватного, учителя.

Я как институт закончил, всегда придерживаюсь этого правила. Зачем себя мучать общением с человеком, который тебе не приятен? Не понимаю.

b707
Offline
Зарегистрирован: 26.05.2017

Mr.Inker пишет:

Но, например, я уже не в том возрасте, что бы  терпеть "говнистость" некоторых персонажей, даже ради новых знаний. Гордость не позволяет. Проще найти другого, адекватного, учителя.

ага... или просто бросить обучение, зачем себя мучить.

К сожалению... или к счастью - но мой опыт подсказывает, что больше всего можно научиться как раз именно у "говнистых" персонажей. Видимо высокий IQ плохо уживаются с вежливостью к окружающим, большинство из которых представляются учителю с его интеллектуальной высоты реальными даунами.

А вот вежливые и приветливые учителя на поверку часто оказываются пустозвонами. Хотя, конечно. "говнистость" еще не гарантия высоких знаний :)

А чтобы не ущемлять вашу гордость - можно учиться по книжкам. "Я, как институт закончил - всегда придерживаюсь этого правила" (с)

Mr.Inker
Offline
Зарегистрирован: 18.01.2020

 

 

 

 

Все правильно сказано, и если реального выбора нет, можно и потерпеть )

Но в данном случае он есть.

и 5 лет программирования в ВУЗе (С и С++ и даже немного бэйсика ... бррр), к сожалению, не востребованные за последние 22 года (работаю по "железу"), до того момента, как занялся ардуинкой и решил учиться )

В общем, за месяц, как мне в руки попал стартовый набор ардуино, я впервые столкнулся со случаем, когда не смог(вот сразу, как привык) разобраться, ибо все делал правильно... даже разобрался как рекомпилить glcdfont.c со своим шрифтом, и в итоге как в utf8rus делать сдвиги...

но такой нюанс, как работа с библиотеками в Arduino IDE, и что он с репо, сохраняет библиотеки не в основную папку, которой я считал папку установки программы, а,почему то, в папку со скетчами.. для меня был удивителен. 

и разобрался, в итоге, сам.

ПС

и 2 учебника у меня тоже в быстром доступе )

Монк и Блум. Почитываю перед сном. Но уже даже боюсь представить, что местное комьюнити скажет про эти учебники... =DDD

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Mr.Inker пишет:
Монк и Блум. Почитываю перед сном. Но уже даже боюсь представить, что местное комьюнити скажет про эти учебники... =DDD
Замечательные "детские" книжки для чтения перед сном. Но чем быстрее из них вырастите , тем более сложный напишите проект программы сможете написать.

linas100
Offline
Зарегистрирован: 19.04.2020

Privet ske4 budet rabotat na DS3231?

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

Всем доброго времени!

Накидал скетч (делаю термометр на кухню):

// Подключаем библиотеки:
#include <SPI.h>              // подключаем библиотеку для работы с шиной SPI
#include <Wire.h>             // подключаем библиотеку для работы с шиной I2C
#include "sav_button.h"       // подключаем библиотеку для работы с кнопками
#include <Adafruit_GFX.h>     // подключаем библиотеку для эфектов MAX7219
#include <Max72xxPanel.h>     // подключаем библиотеку для работы с MAX7219
#include "Adafruit_HTU21DF.h" // подключаем библиотеку для работы с HTU21DF


#define CS_PIN          10            // Подключить CS к данному пину, DIN к MOSI 11 пин, а CLK к SCK 13 пин
#define BT_PIN          9             // Пин подключения кнопки
#define NUM_HORIZ_DISP  2             // количество дисплеев 8х8 по горизонтали
#define NUM_VERT_DISP   1             // количество рядов дисплеев
#define WAIT_STR        20            // Пауза в миллисекундах для бегущей строки
#define SPACER          1             // Промежуток между символами (кол-во точек)
#define WIDTH           (5 + SPACER)  // Ширина шрифта (в точках)
#define VIEW_DELAY      5000          // задержка смены отображаемой информации мс

Adafruit_HTU21DF HTU21 = Adafruit_HTU21DF();    // Создаём объект HTU21 для работы с библиотекой Adafruit_HTU21DF
Max72xxPanel LedMatrix = Max72xxPanel(CS_PIN, NUM_HORIZ_DISP, NUM_VERT_DISP);   // объявляем  переменную для работы с MAX7219


unsigned long ms;           // переменная таймера
float realTemp, realHum;    // переменные для хранения температуры и влажности
uint8_t backTime = 0;       // время отображения
uint8_t brLvl = 2 ;         // уровень яркости 0-15
uint8_t i_wst = 0;          // таймер для бегущей строки

bool humView = false;       // флаг отображения влажеости
bool endScroll = false;     // флаг окончания сроллирования строки

String timeStr = "";        // переменная для вывода строки

SButton BUT (BT_PIN,25,1500,2500,500);



void setup(){
  //Serial.begin(9600);

  // Порядок матриц
  LedMatrix.setPosition(0, 0, 0); 
  LedMatrix.setPosition(1, 1, 0); 
  
  // Ориентация каждой матрицы 1 - 90  2 - 180   3 - 270
  LedMatrix.setRotation(0, 1);   
  LedMatrix.setRotation(1, 1);    
  
  LedMatrix.setIntensity(brLvl);  //Яркость от 0 до 15
  LedMatrix.fillScreen(LOW);      // очищаем матрицу
  
  timeStr = "Термометр-гигрометр HTU21 ардуино V1.0";
  timeStr = utf8rus(timeStr);   // Перекодируем из UNICODE
  while(!endScroll){
    WriteScrollText();
    delay(20);
  }// end while
  
  timeStr ="";
  delay(1000);
  LedMatrix.fillScreen(LOW);   // очищаем матрицу

      
  if (!HTU21.begin()) {
    //Serial.println("Couldn't find sensor!");  // для отладки
    timeStr = "Ошибка датчика HTU21";
    timeStr = utf8rus(timeStr);   // Перекодируем из UNICODE
    while(1){
      WriteScrollText();
      delay(20);
    }// end while  
  }// end if

  BUT.begin();
  
}// end setup()                                                        


void loop(){
  ms = millis();
  if (ms % VIEW_DELAY == 0 && endScroll){
    humView = !humView; // инвертируем значение флага отбражения
    GetHTUData();
    i_wst = 0;
  }// end if 

  if (ms % WAIT_STR == 0){
    WriteScrollText();  
  }//end if

  //обработка кнопки
  switch(BUT.Loop()){
    case SB_NONE:
    break;
    
    case SB_CLICK:
      brLvl++;
      if (brLvl > 15) brLvl = 0;
      LedMatrix.setIntensity(brLvl);  //Яркость от 0 до 15    
    break;
    
    case SB_LONG_CLICK:
    
    break;
    
    case SB_AUTO_CLICK:
      
    break;
  }//end switch(BUT.Loop())
}//end loop
  
//------------------------------------------------------------------------
// Вывод бегущей строки на дисплей (1 такт)
void WriteScrollText(){
  // если i_wst больше, чем длина строки + длина экрана 
  if(i_wst >= WIDTH * timeStr.length() + LedMatrix.width() - 1 - SPACER){
    i_wst = 0;
    endScroll = true;
    return;
  }// end if
  LedMatrix.fillScreen(LOW);   // очищаем матрицу
  int letter = i_wst / WIDTH;
  uint8_t x = (LedMatrix.width() - 1) - i_wst % WIDTH;
  uint8_t y = (LedMatrix.height() - 8) / 2;   // центрируем строку по вертикали
  while (x + WIDTH - SPACER >= 0 && letter >= 0){
    if (letter < timeStr.length()){
      LedMatrix.drawChar(x, y, timeStr[letter], HIGH, LOW, 1);
    }// end if
    letter--;
    x -= WIDTH;
  }// end while
  LedMatrix.write(); // Send bitmap to display
  i_wst++;
}// end ScrollText()

//-------------------------------------------------
// Формирование строки для вывода данных
void GetHTUData(){
  // Температура
  if (!humView){
    timeStr = "Т ";
    timeStr += String(HTU21.readTemperature()); // считываем температуру
    timeStr +="'C ";
  }// end if
  // Влажность
  else{  
    timeStr = "В ";
    timeStr += String(HTU21.readHumidity());  // считываем влажность
    timeStr +="%";
  }// end if
  timeStr = utf8rus(timeStr);   // Перекодируем из UNICODE
}// end GetHTUData()


//------------------------------------------------------
// Перекодировка русских шрифтов из 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;
          }// end if
          if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
        break;
        
        case 0xD1: 
          n = source[i];
          i++;
          if (n == 0x91){
            n = 0xB7;
            break;
          }// end if
          if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
        break;
        
      }// end switch
    }// end if
    m[0] = n;
    target = target + String(m);
  }// end while
  return target;
}// end utf8rus()

Возник вопрос: при выводе информации со стр. 52 по 57, "бегущая строка" двигается плавно, а вот при выводе из основного цикла она двигается медленнее и с некоторыми рывками. Что ее так может тормозить? Вроде цикл не особо загружен. Специально сделал опрос датчика в момент смены информации. Ардуина на 3.3В, 8Мгц.

 

b707
Offline
Зарегистрирован: 26.05.2017

интервал  в строчках 81 и 87 считаете неправильно. Это условие

if (ms % WAIT_STR == 0){

сработает только если между вызовами прошло ровно 20мс. А если 19 или 21 - то уже все, пойдет на следующий круг.

В результате у вас строчка на экране двигается не каждые 20мс, а только когда интервал точно совпал... а это не каждый раз

 

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

Да, точно, может и проскочить, что-то не подумал об этом. Спасибо! Попробую переделать: 

if ((millis() - ms > VIEW_DELAY) && endScroll){
    ms = millis();

Хотел малой кровью обойтись, одной long переменной обойтись...

 

b707
Offline
Зарегистрирован: 26.05.2017

mir0tv0rec пишет:

Хотел малой кровью обойтись, одной long переменной обойтись...

на самом деле в том варианте вам и одна переменная была не нужна, можно записать вот так

if ( millis() % 20 == 0)

 

но теперь вы знаете, что этот метод срабатывает нечетко

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

Это я теперь понял, не всегда будет цикл попадать на это условие...

А про переменные, я имел ввиду вот это:

  if (((millis() - ms) > VIEW_DELAY) && endScroll){
    ms = millis();
    humView = !humView; // инвертируем значение флага отбражения
    GetHTUData();
    i_wst = 0;
  }// end if 

  if ((millis() - ms1) > WAIT_STR){
    ms1 = millis();
    WriteScrollText();  
  }//end if

Пришлось 2 переменные вводить для 2х условий

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

Товарищи, еще вопрос, как из этого шрифта знак градуса вывести?

#ifndef FONT5X7_H
#define FONT5X7_H

#ifdef __AVR__
 #include <avr/io.h>
 #include <avr/pgmspace.h>
#elif defined(ESP8266)
 #include <pgmspace.h>
#else
 #define PROGMEM
#endif

// Standard ASCII 5x7 font

static const unsigned char font[] PROGMEM = {

0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x05, 0x03, 0x00, 0x00, // символ градуса
0x3E, 0x6B, 0x6F, 0x6B, 0x3E, 0x0C, 0x1E, 0x3C, 0x1E, 0x0C, 
0x08, 0x1C, 0x3E, 0x1C, 0x08, 0x1C, 0x4A, 0x7F, 0x4A, 0x1C, 
0x18, 0x5C, 0x7F, 0x5C, 0x18, 0x00, 0x1C, 0x1C, 0x1C, 0x00, 
0x7F, 0x63, 0x63, 0x63, 0x7F, 0x00, 0x1C, 0x14, 0x1C, 0x00, 
0x7F, 0x63, 0x6B, 0x63, 0x7F, 0x30, 0x48, 0x4D, 0x33, 0x07, 
0x06, 0x29, 0x79, 0x29, 0x06, 0x20, 0x50, 0x3F, 0x02, 0x0C, 
0x60, 0x7F, 0x05, 0x35, 0x3F, 0x2A, 0x1C, 0x77, 0x1C, 0x2A, 
0x00, 0x7F, 0x3E, 0x1C, 0x08, 0x08, 0x1C, 0x3E, 0x7F, 0x00, 
0x14, 0x22, 0x7F, 0x22, 0x14, 0x00, 0x5F, 0x00, 0x5F, 0x00, 
0x06, 0x09, 0x7F, 0x01, 0x7F, 

Шрифт этот сейчас подключен, не могу найти, как знак градуса на дисплей вывести.

b707
Offline
Зарегистрирован: 26.05.2017

а выводите чем? Надо смотреть исходник библиотеки, что выводит символы из этого фонта и разбираться, какой размер букв и как вычисляется смещение буквы в фонте

mir0tv0rec
Offline
Зарегистрирован: 19.09.2018

Скетч выше выкладывал, библиотека adafruit. Шрифт 7х5.

P.S. разобрался, вывел по очереди все символы...