Ардуино+MAX7219
- Войдите на сайт для отправки комментариев
Собрал часы на Arduino NANO и MAX7219, однако при загрузке скетча на строке: DS3231 RTC ( SDA, SCL ) ; // Часы
реального времени
возникает ошибка - no matching function for call to 'DS3231::DS3231(const uint8_t&, const uint8_t&)'- no matching function for call to 'DS3231::DS3231(const uint8_t&, const uint8_t&)'.
Прошу помочь разобраться
(https://www.hackster.io/M-V-P/arduino-nano-clock-with-4x64-led-matrix-409730 - оригинал статьи и скетча)
/ * Часы Arduino Nano DS3231 со светодиодной матрицей 4x ( 8x8 ) SPI
*
* Arduino Nano 5V логика - 32кБ прог. пространство
* Инструменты: Доска: Arduino Nano ; Процессор: ATmega328P ( Старый загрузчик ) !!
* LED Matrix 4x ( 8x8 ) SPI с разъемом на правой стороне ( последний модуль )
* https://www.banggood.com/MAX7219-Dot-Matrix-Module-4-in-1-Display-For-Ar... = myorder & cur_warehouse = CN
*
* СОЕДИНЕНИЯ:
* >> LCD 4x64 -> Arduino Nano: ( с использованием аппаратного SPI ) :
* 5 В -> 5 В контакт
* GND -> контакт GND
* CLK_PIN -> 13 // или SCK
* DATA_PIN -> 11 // или MOSI
* CS_PIN -> 10 // или SS
*
* >> DS3231 RTC -> Arduino Nano:
* SDA ( DAT ) -> A4
* SCL ( CLK ) -> A5
* Вдохновлено: 1 ) Часы Arduino от AnthoTRONICS Последнее редактирование: 22 марта 2019 г.
* но без MD_parola из-за большого размера! Новая функция getdate .
* 2 ) Простейшие цифровые часы UNO от plouc68000:
* https://create.arduino.cc/projecthub/plouc68000/simplest-uno-digital-clo... = пользователь & ref_id = 680368 & offset = 1
* 3 ) LEDDotMatrixClock.ino от Леонардо Спосина, но здесь без «Max72xxPanel.h»
* https://github.com/leonardosposina/arduino-led-dot-matrix-clock/blob/mas...
* Не используется Max72xxPanel.h, но используются небольшие цифры. Небольшой код здесь.
* Заменить в библиотеке MD_MAX72XX / src / MD_MAX72xx_font.cpp:
* 1 ) #define USE_NEW_FONT 1
* 2 ) шрифты № 148 ... 158 необходимо заменить шрифтами 3х5:
3 , 248 , 136 , 248 , // 48 0
3 , 144 , 248 , 128 , // 49 1
3 , 200 , 168 , 184 , // 50 2
3 , 136 , 168 , 248 , // 51 3
3 , 112 , 72 , 224 , // 52 4
3 , 184 , 168 , 232 , // 53 5
3 , 248 , 168 , 232 , // 54 6
3 , 8 , 232 , 24 , // 55 7
3 , 248 , 168 , 248 , // 56 8
3 , 184 , 168 , 248 , // 57 9
1 , 80 , // 58 :
*
* проект: 13790 байт ( 44 % ) ; переменные 361 байт ( 17 % )
* Автор: MVP https://www.hackster.io/MVP
* /
#include <SPI.h>
#include "DS3231.h"
#include "MD_MAX72xx_lib.h"
// # include "Font_Data.h"
DS3231 RTC ( SDA, SCL ) ; // Часы
реального времени
константный байт LDR_PIN = A2 ; // Вывод датчика LDR
#define MAX_DEVICES 4
// Определяем контакты
#define CLK_PIN 13 // или SCK
#define DATA_PIN 11 // или MOSI
#define CS_PIN 10 // или SS
#define HARDWARE_TYPE MD_MAX72XX :: ICSTATION_HW
#define USE_NEW_FONT 1
#define BUF_SIZE 20 // размер текстового буфера
#define CHAR_SPACING 1 // пиксели между символами
символ buf [ BUF_SIZE ] , сек [ 4 ] ;
uint8_t dots ;
// Аппаратный интерфейс SPI
// Max72xxPanel matrix = Max72xxPanel ( CS_PIN, H_DISPLAYS, V_DISPLAYS ) ;
Матрица MD_MAX72XX = MD_MAX72XX ( HARDWARE_TYPE, CS_PIN, MAX_DEVICES ) ;
const byte WAIT = 100 ;
константный байт SPACER = 1 ;
байт FONT_WIDTH ;
bool timeset = false ;
void AdjustClock ( String data ) {
byte _day = data.substring ( 0 , 2 ) .toInt () ;
byte _month = data.substring ( 3 , 5 ) .toInt () ;
int _year = data.substring ( 6 , 10 ) .toInt () ;
byte _hour = data.substring ( 11 , 13 ) .toInt () ;
byte _min = data.substring ( 14 , 16 ) .toInt () ;
байт _sec = data.substring ( 17 , 19 ) .toInt () ;
rtc.setTime ( _hour, _min, _sec ) ;
rtc.setDate ( _day, _month, _year ) ;
Serial.println ( F ( ">> Дата и время успешно установлены!" )) ;
время = истина ;
}
byte ledintensitySelect ( int light ) {
байт _value = 0 ;
if ( light> = 0 && light < = 127 ) {
_value = 12 ;
} else if ( light> = 128 && light < = 319 ) {
_value = 3 ;
} else if ( light> = 320 && light < = 512 ) {
_value = 0 ;
}
вернуть _value ;
} ;
void printText ( uint8_t modStart, uint8_t modEnd, char * pMsg )
// Вывести текстовую строку в указанные модули светодиодной матрицы.
// Область сообщения дополняется пустыми столбцами после печати.
{
состояние uint8_t = 0 ;
uint8_t curLen ;
uint16_t showLen ;
uint8_t cBuf [ FONT_WIDTH ] ;
int16_t col = (( modEnd + 1 ) * COL_SIZE ) - 1 ;
matrix.control ( modStart, modEnd, MD_MAX72XX :: UPDATE, MD_MAX72XX :: OFF ) ;
do // конечный автомат для печати символов в доступном пространстве
{
переключатель ( состояние )
{
case 0 : // Загрузить следующий символ из таблицы шрифтов
// если мы достигли конца сообщения, сбрасываем указатель сообщения
если ( * pMsg == '\ 0' )
{
showLen = col - ( modEnd * COL_SIZE ) ; // заполнение символов
состояние = 2 ;
перерыв ;
}
// получить следующий символ из файла шрифта
showLen = matrix.getChar ( * pMsg ++, sizeof ( cBuf ) / sizeof ( cBuf [ 0 ]) , cBuf ) ;
curLen = 0 ;
состояние ++ ;
// !! сознательно перейти к следующему состоянию, чтобы начать отображение
case 1 : // отображать следующую часть символа
matrix.setColumn ( col--, cBuf [ curLen ++ ]) ;
// сделано с символом шрифта, теперь отображаем пробел между символами
if ( curLen == showLen )
{
showLen = CHAR_SPACING ;
состояние = 2 ;
}
перерыв ;
case 2 : // инициализировать состояние для отображения пустых столбцов
curLen = 0 ;
состояние ++ ;
// провалиться
case 3 : // отображать межсимвольный интервал или конец заполнения сообщения ( пустые столбцы )
matrix.setColumn ( col--, 0 ) ;
curLen ++ ;
if ( curLen == showLen )
состояние = 0 ;
перерыв ;
дефолт:
col = -1 ; // это определенно завершает цикл
do }
} while ( col> = ( modStart * COL_SIZE )) ;
matrix.control ( modStart, modEnd, MD_MAX72XX :: UPDATE, MD_MAX72XX :: ON ) ;
}
void setup () {
pinMode ( LDR_PIN, INPUT_PULLUP ) ;
Serial.begin ( 9600 ) ;
Serial.println ( F ( ">> Матричные часы с точечным светодиодом Arduino 32x8!" )) ;
Serial.println ( F ( ">> Используйте формат <дд / мм / гггг чч: мм: сс> для установки даты и часа часов!" )) ;
rtc.begin () ;
matrix.begin () ;
matrix.clear () ;
FONT_WIDTH = 5 + SPACER ; // Ширина шрифта 5 пикселей
matrix.control ( MD_MAX72XX :: INTENSITY, 2 ) ;; // Используем значение от 0 до 15 для яркости
}
void getDate ()
// Настройка даты: код для чтения даты часов
{ char * month [] = { "январь" , "февраль" , "март" , "апрель" , "май" , "июнь" , "июль" , "август" , "сентябрь" , "октябрь" , "ноябрь" " , " Dec " } ;
String dts = rtc.getDateStr () ; // Получить строку дд / мм / гггг
String dds = dts.substring ( 0 , 2 ) ; // Извлечение даты
String mms = dts.substring ( 3 , 5 ) ; // Извлечь месяц
int mm = mms.toInt () ; // Преобразовать в номер месяца
dds.concat ( "" ) ;
dds.concat ( String ( месяцы [ мм-1 ])) ; // Перестроить строку даты как "dd Mmm"
dds.toCharArray ( buf, sizeof ( buf )) ; // возврат буфера
}
void getHour ()
// Настройка даты: код для чтения даты часов
{ char * month [] = { "январь" , "февраль" , "март" , "апрель" , "май" , "июнь" , "июль" , "август" , "сентябрь" , "октябрь" , "ноябрь" " , " Dec " } ;
String dts = rtc.getTimeStr () ; // Получить строку чч: мм: сс
String hhs = dts.substring ( 0 , 2 ) ; // Извлечь час
int hh = hhs.toInt () ; // Преобразовать в число
if ( hh < 10 ) точек = 7 ;
если ( чч> 19 && чч < 24 )
точки = 13 ;
если (( чч> 9 && чч < 20 ) || ( чч == 21 ))
точки = 11 ;
if ( hh == 1 ) dots = 5 ;
if ( hh == 11 ) dots = 10 ;
// String outmsg = dts.substring ( 0 , 5 ) ; // Извлечение чч: мм ( необязательно )
String outmsg = String ( чч ) ; // Извлекаем h, если h < 10
outmsg.concat ( ":" ) ; // Добавить :
outmsg.concat ( dts.substring ( 3 , 5 )) ; // добавить мм
outmsg.toCharArray ( buf, BUF_SIZE ) ;
}
void showsec ()
{
String dts = rtc.getTimeStr () ; // Получить строку чч: мм: сс
Строка scs1 = dts.substring ( 6 , 7 ) ;
Строка scs2 = dts.substring ( 7 ) ;
char sc1 = 148 + scs1.toInt () ; // Преобразовать в индекс char
char sc2 = 148 + scs2.toInt () ; // Преобразовать в индекс char
matrix.setChar ( 6 , sc1 ) ;
matrix.setChar ( 2 , sc2 ) ;
}
void loop () {
byte ledIntensity = ledintensitySelect ( analogRead ( LDR_PIN )) ;
matrix.control ( MD_MAX72XX :: INTENSITY, ledIntensity ) ;; // Используем значение от 0 до 15 для яркости
// Показать чч: мм из буфера
getHour () ;
printText ( 0 , MAX_DEVICES-1, buf ) ;
задержка ( ПОДОЖДИТЕ ) ;
// мигает две точки:
for ( uint8_t i = 0 ; i < 8 ; i ++ ) {
matrix.setColumn ( MAX_DEVICES * 8 точек, 36 ) ;
showsec () ;
задержка ( 250 ) ;
matrix.setColumn ( MAX_DEVICES * 8-точек, 0 ) ;
showsec () ;
задержка ( 250 ) ;
}
// Выход с прокруткой вверх:
for ( uint8_t i = 0 ; i < 8 ; i ++ ) {
matrix.transform ( MD_MAX72XX :: TSU ) ; задержка ( 2 * ПОДОЖДИТЕ ) ;
задержка ( ПОДОЖДИТЕ ) ;
}
getDate () ;
printText ( 0 , MAX_DEVICES-1, buf ) ;
задержка ( 20 * ПОДОЖДИТЕ ) ;
int temp = rtc.getTemp () ;
temp = temp-1 ; // Смещение -1 С
String outmsg = String ( temp ) ;
outmsg.concat ( "C" ) ;
outmsg.toCharArray ( buf, BUF_SIZE ) ;
printText ( 0 , MAX_DEVICES-1, buf ) ;
задержка ( 20 * ПОДОЖДИТЕ ) ;
// Установка времени в RTC:
if ( Serial.available () > 0 && timeset == false ) {
AdjustClock ( Serial.readString ()) ;
}
}
вставьте код в сообщение правильно
И ношкой топни.
А научились переводчиком пользоваться. Порадовало:
* Вдохновлено: 1 ) Часы Arduino от AnthoTRONICS Последнее редактирование: 22 марта 2019 г.
не понял Вашего совета. Что и куда я должен вставить? Я скопировал сообщение об ошибке и приложил скетч, который скачал с сайта автора
Вы вставили код скетча неправильно. Сравните, как выглядит код у вас. и как в любой соседней теме, например тут:
http://arduino.ru/forum/programmirovanie/avtomaticheskii-schetchik
Спасибо b707 за ценный совет. Сообщаю, что в Ардуино код (скетч) я загрузил с сайта разработчика ничего не меняя (без перевода). Поэтому еще раз повторяю, подскажите, пожалуйста, мне, пожилому человеку, в чем ошибка и как ее исправить? Сообщение об ошибке и строку, на которую ошибка ссылается, я показал. Поэтому и прошу вашей помощи уважаемые знатоки. Надеюсь на конструктивные советы.
Не обижайтесь на предложение оформить вставку кода, как положено, иначе очень трудно читать и, соответственно, отвечать.
А по теме: в скетче я не вижу определения констант SCL, DAT, скорее всего, они берутся из файла SPI.h и конфликтуют с параметрами, которые принимает конструктор библиотеки DS2131, которую использовал автор приведенного скетча.
Попробуйте написать DS3231 RTC ( DATA_PIN, CLК_PIN ), эти константы определены прямо в скетче.
Вставьте код правильно, как в этой инструкции (нумерацию строк НЕ убирайте).
Сдаётся мне, что вот так оно надо, без параметров:
DS3231 RTC; // Часы
Спасибо b707 за ценный совет. Сообщаю, что в Ардуино код (скетч) я загрузил с сайта разработчика ничего не меняя (без перевода).
такое впечатление, что вы читать не умеете. При чем тут то, откуда вы взяли скетч и меняли ли вы его? - Я вам написал. что вы неправильно вставили скетч В ФОРУМ, а вы "включаете дурочку" и делаете вид, что вас это не касается.
Отвечу, хотя и не стоило было. У вас проблема в неправильной библиотеке. Дело в том, что библиотек DS3231.h существует несколько и автор использует не ту DS3231.h. что лежит на сайте Ардуино. Библиотеку, которую использовал автор. можно скачать на том же сайте, где вы скачали сам скетч. Ссылка на страницу с исходным кодом у вас вставлена прямо в заголовк скетча в комментариях.
Спасибо b707 и другин ардуинщикам за советы. Буду пробовать поменять библиотеку DS3231.h на версию в авторском скетче. И подскажите тогда еще, только не сердитесь, как тогда отличать версии библиотек и надо ли удалить ту версию, что стоит у меня. Буду признателен за ответ
подскажите тогда еще, только не сердитесь, как тогда отличать версии библиотек и надо ли удалить ту версию, что стоит у меня. Буду признателен за ответ
Различать библиотеки с одинаковыми именами - это проблема. Единого рецепта нет. Надежнее всего брать те же библиотеки, что использовал автор программы.
На второй вопрос - дублирующиеся библиотеки лучше удалять
А мы так и не увидели начальника транспортного... в смысле нормально вставленной программы. Это саботаж или тупизм?
Спасибо, буду пробовать
Спасибо, буду пробовать
Т.е. Вы всех обосрали. Что Вас просили по поводу программы Вы не сделали. Но будете пробовать?
Писец. И Вам ещё кто-то помогает?
Мозахисты, видимо...
не надо обижаться и грубить. Я ведь прошу Вашей помощи и еще много чего не знаю.
А это норма, постоянно у ардодротов сталкиваюсь с хамством, секта у них что ли такая... Спрашивать тут бесполезно, я у англичан спрашиваю и всегда адекватные люди там.
Вы специально здесь зарегистрировались, чтобы нам это сообщить?
Ну раз без регистрации нельзя. Почитал ветку, реально по теме было 2 ответа, остальное спам.
Ну раз без регистрации нельзя
Но очень хотелось. Спасибо, ваше мнение очень ценно для нас )))
Естественно! Не за что.
Естественно! Не за что.
и как отвечать человеку, который взял чужой код, пришел на другой форум и задал вопрос не по существу?... Т.е. весь его труд сКопиПастить
формат этого форума - помочь в малом, а не сделать вместо... вот только для одного малое- это таймер или прерывание, а для другого сопротивление и диод.
теперь, каждый день на форум приходит множество "просителей" палец о палец не ударившее и просят исправить чужой код. Тут ответа два или сайт разраба говнокода или топик ищу исполнителя.
Есть третий вариант - научиться, но обычно очень редко кто на него соглашается.
кроме всего прочего - пост 10, 11, 12, 13... и какие могут быть обиды?
не надо обижаться и грубить. Я ведь прошу Вашей помощи и еще много чего не знаю.
если хотите помощи - обращайте внимания на советы, хотя-бы осмысливайте их. Был тут у нас один примечательный персонаж - Клапауций - грубиян и хам... его очень долго терпели, а это разве грубость?!!! Вот он хамил всем и всегда. Но даже своим хамством помогал многим - так сказать магический пинок делал... вот только хрустальные шары запретил... до сих пор его запрет помнят и чтят... :)
И лучший ответ отправить в гугл? Сложно сказать, иди мимо, не сложно- ответь. Народ как то оскатинился.
Народ как то оскатинился.
Злые языки утверждают, что "адекватные" англичане - большие мастера вежливого оскорбления. Не знаючи - и не поймешь ;)
Народ как то оскатинился.
В смысле скатывается по наклонной? Или это от "оскал"?
И лучший ответ отправить в гугл? Сложно сказать, иди мимо, не сложно- ответь. Народ как то оскатинился.
Вот я ещё не забыл те времена, когда КНИГА была лучшим учителем, никаких интернетов и смартфонов. Все запоминали, потому что таскать с собой библиотеку весом в 4-5 сотен килограмм в виде книг было не легко. Ничего, жили, работали, ПОМНИЛИ ЧТО КУДА И ЗАЧЕМ. Никто и не знал что такое «гуглить». Помогали товарищам, правда в основном не в Гугл посылали, а нужную книгу давали для прочтения. Сейчас (видимо темп жизни такой скорый) никто ничего ни читать (не то что учить) не хочет - надо сразу и быстро и чтобы без регистрации смс и оплаты. А думать и мыслить кто будет? Другие? А «и кушать вы за меня буде е? - Ага!» ))
Народ как то оскатинился.
В смысле скатывается по наклонной? Или это от "оскал"?
В наших краях водится рыба скат. Наступишь - ударит хвостом в ногу. Похоже от этого.)
Народ как то оскатинился.
Злые языки утверждают, что "адекватные" англичане - большие мастера вежливого оскорбления. Не знаючи - и не поймешь ;)
только ли англичане? в одной уважаемой конторе моя начальница перевела Большому Боссу, что я ему сказал, это был мой последний день работы в Уважаемой конторе )))