Arduino uno+ds3231+max7219+7-ми сигментный индикатор
- Войдите на сайт для отправки комментариев
Нужна помощь знающих людей! Только начал осваивать сей непростой девайс! Хочу заставить работать часы на 7-ми сегментном индикаторе! Сам процесс который будет происходить впринципи понимаю, но сказать немогу(т,е обьяснить его микроконтроллеру) нужна помощь с кодом поскольку остановаился почти в начале! перекопал множество информации в нете но так и не нашел примитивных часов на 7-ми сигментниках в таком исполнении и приложенным готовым кодом)! Помогите кто чем может) советом или ссылкой на скетч подобного! мой скетч прикладываю но он не рабочий поскольку в нем по сути только старт библиотек) хоть будет понятно к чему что подключенно наверное))) Основной вопрос с чтением данных с часов и выводом их на 7сигментный!?!?!?! И само програмирование Max72xx какие команды что означают?(пытаюсь вкурить как работает Ledcontrol библиотека с помощью http://playground.arduino.cc/Main/LedControl#.Uya7d_l_uNi)!
#include <DS3231.h> #include <Wire.h> //старт библиотек #include "LedControl.h" LedControl lc=LedControl(12,11,10,1); //пины подключения max72xx(для 1-го макса) DS3231 Clock; byte hour, minute; //это тоже не знаю взял со скетча часов int clockPin pin //здесь нужно как то задать пины часов я так понимаю часов (А4;А5) void setup() { Wire.begin(); //старт связи и как то надо указать что опросить(например часы) lc.shutdown(0,false); //вкл max72xx lc.setIntensity(0,8); //яркость дисплея(сигмента) lc.clearDisplay(0); // очистка дисплея } void ReadDS3231()
Основной вопрос с чтением данных с часов и выводом их на 7сигментный!?!?!?!
для начала считываем время. смотрим пример к часам
далее проверяем дисплей из примеров
и только после этого переходим к совместной работе
Как то так? исправляийте и добовляйте!?
ну нет так нет
Советую научиться работать с каждым из устройств отдельно желательно без использования библиотек ну или хотябы разобрать код библиотеку по частям и понять что каждая часть делает
вот например кусок кода для работы с DS1307 чтение значений текущего времени и даты при помощи стандартной библиотеки wire
second, minute, hour, dow, day, month, year Это переменные для хранения текущих значений времени и даты формата uint8_t(беззнаковое целое 8 бит значения от 0 до 255) за исключением year - uint16_t(аналог unsigned int)
bcd2dec функция преобразует формат BCD в нем получаем значения от DS в обычный десятичный формат
в общем если с DS возникнут проблеммы могу помочь с max7219 сложнее с ней не работал но по описанию если вникнуть тоже ничего сложного
Вот почитайте как работать с max7219
http://radiohlam.ru/raznoe/max7219_7221.htm
спасибо громадное! сейчас начну переваривать вашу информацию!)
еще такой вопрос чтение времени должно происходить постоянно! значит его вводить! в
void
loop
()!
правильно?пока такой скетчик получается!!! но не проходит проверку чтения минут и часов!
Я не специалист, но что-то мне кажется без wire.begin() ничего не получится
для начала считываем время. смотрим пример к часам
далее проверяем дисплей из примеров
и только после этого переходим к совместной работе
Жека дал ДЕЛЬНЫЙ совет.
Научитесь сначала работать с часами и дисплеем по отдельности.
для начала считываем время. смотрим пример к часам
далее проверяем дисплей из примеров
и только после этого переходим к совместной работе
Жека дал ДЕЛЬНЫЙ совет.
Научитесь сначала работать с часами и дисплеем по отдельности.
Неа, так не интересно, никакого секаса не получится)))
Да без wire.begin() работать не будет, а также без обявления переменных.
Для начала скажите какую библиотеку для ds вы используете, а я помогу разобрать ее на части и понять что каждая часть кода делает и в каком порядке.
Да без wire.begin() работать не будет, а также без обявления переменных.
Для начала скажите какую библиотеку для ds вы используете, а я помогу разобрать ее на части и понять что каждая часть кода делает и в каком порядке.
DS библиотеку использую DS3231.h
И ссылочку где скачали а то штатный экстрасенс в отпуске
googl по запросу arduino DS3231 на 1 странице нашел минимум две библиотеки
Кстати вот полный код скетча для работы с DS1307 c DS3231 тоже бедет работать.
#include <Wire.h> //Переменные для хранения текущего времени и даты uint8_t second; uint8_t minute; uint8_t hour; uint8_t dow; uint8_t day; uint8_t month; uint16_t year; //Вспомогательные переменные unsigned long currentMillis = 0; const char* dowSTR[7] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"}; void setup() { Wire.begin(); Serial.begin(9600); // Ниже если нужно установить время и дату в скобках после if поставить 1 (if(1)) if(0){ stopClock(); fillByYMD(2015, 2, 16); //дата в формате YYYY, MM, DD fillByHMS(20, 30, 40); //Время в формате hh, mm, ss setDate_Time(); startClock(); } getTime(); //читаем время getDate(); // читаем дату print_Time(); } void loop() { //проверка прошла ли секунда с момента последнего чтения if (currentMillis + 1000 <= millis()) { currentMillis = millis(); getTime(); //читаем время getDate(); // читаем дату //Выводим то что прочитали в сериал порт print_Time(); } //место для вашего кода } //Весь код ниже можно поместить в отдельную вкладку //Функция выводит время и дату в сериал порт void print_Time(){ Serial.print(F("Current Time ")); //F() Это макрос который хранит строку в програмной памяти Serial.print(hour); Serial.print(":"); if(minute < 10){ Serial.print("0"); } Serial.print(minute); Serial.print(":"); if(second < 10){ Serial.print("0"); } Serial.print(second); Serial.print(F(" Current Data ")); Serial.print(dowSTR[dow]); Serial.print(" "); Serial.print(day); Serial.print("."); if(month < 10){ Serial.print("0"); } Serial.print(month); Serial.print("."); Serial.println(year); } //Функция получения времени void getTime() { //Говорим (отдаем команду по шине I2C) DS что хотим из нее читать Wire.beginTransmission(0x68); //говорим ардуино что сейчас будем чтото передавать для устройства I2C с адресом 0x68 Wire.write((uint8_t)0x00); //говорим устройству встать на регистр с адресом 0x00 Wire.endTransmission(); //Закрываем передачу //Говорим ардуине что мы сейчас будем читать 7 байт с устройство на шыне I2C с адресом 0x68 Wire.requestFrom(0x68, 3); //собственно читаем последовательно вышеозначенные 7 байт (почему именно 7 смотри в документацию на DS1307(DS3231 стр 11)) second = bcd2dec(Wire.read() & 0x7f);// читаем секунды minute = bcd2dec(Wire.read()); // читаем минуты hour = bcd2dec(Wire.read()); // читаем часы } //Функция получения даты void getDate(void) { Wire.beginTransmission(0x68); Wire.write((uint8_t)0x03); Wire.endTransmission(); Wire.requestFrom(0x68, 4); // Запрос данных dow = bcd2dec(Wire.read()); // читаем день недели dow--; // корректируем формат дня недели из формат DS (1...7) в формата библиотеки (0...6) day = bcd2dec(Wire.read()); // читаем день month = bcd2dec(Wire.read()); // читаем месяц year = bcd2dec(Wire.read()); // читаем год двухзначный формат year = year + 2000; // корректируем год в четырехзначный формат } //Функция остановки часов void stopClock(){ Wire.beginTransmission(0x68); Wire.write((uint8_t)0x00); // Адрес регистра содержащего бит CH = 0x00 Wire.endTransmission(); Wire.requestFrom(0x68, 1); second = Wire.read() | 0x80; // Сохраняем секунды и устанавлеваем 7 бит (CH bit) в high Wire.beginTransmission(0x68); Wire.write((uint8_t)0x00); Wire.write((uint8_t)second); // Записываем секунды с установленным битом CH = часы остановленны Wire.endTransmission(); } // Функция запуска часов void startClock(){ Wire.beginTransmission(0x68); Wire.write((uint8_t)0x00); // Адрес регистра содержащего бит CH = 0x00 Wire.endTransmission(); Wire.requestFrom(0x68, 1); second = Wire.read() & 0x7f; // Сохраняем секунды и устанавлеваем 7 бит (CH bit) в low Wire.beginTransmission(0x68); Wire.write((uint8_t)0x00); Wire.write((uint8_t)second); // Записываем секунды с установленным битом CH = часы запущенны Wire.endTransmission(); } //Функция записи даты и времени в ds void setDate_Time(){ Wire.beginTransmission(0x68); //говорим ардуине что сейчас мы будем передавать данные в устройство I2C с адресом 0x68 Wire.write((uint8_t)0x00); // устанавливаем адрес первого регистра (с него начнется запись данных устройством) //сама передача данных (после каждой команды Wire.write адрес регистра инкрементируется) Wire.write(dec2bcd(second) | 0x80); Wire.write(dec2bcd(minute)); Wire.write(dec2bcd(hour) & 0x3f); Wire.write(dec2bcd(dow+1)); Wire.write(dec2bcd(day)); Wire.write(dec2bcd(month)); Wire.write(dec2bcd(year-2000)); Wire.endTransmission(); } //Функция для утстановки времени в переменные в качестве параметров принимает часы, минуты, секунды void fillByHMS(uint8_t h, uint8_t m, uint8_t s) { hour = h; minute = m; second = s; } //функция для установки даты в переменные в качестве параметров принимает год, месяц, день void fillByYMD(uint16_t y, uint8_t m, uint8_t d) { year = y; month = m; day = d; calculate_dow(); } //Функция считает день недели по дате void calculate_dow(void) { int a = (14 - month)/12; int y = year - a; int m = month + 12 * a - 2; dow = (7000 + (day + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12)) % 7; } //конвертация формата BCD в десятичный uint8_t bcd2dec(uint8_t num) { return ((num / 16 * 10) + (num % 16)); } //конвертация из десятичного числа в BCD uint8_t dec2bcd(uint8_t num) { return ((num/10 * 16) + (num % 10)); }
Глянул тут в дш функция установки времени работать не будет там адрес регистра содержащего бит остановки хода другой
Сори! много разных качал не помню где эту библиотеку так что выложу ссылку на нее в файлообменике!)
http://dropmefiles.com/6uaAs
вот тоже чтото намудрил но проверку не проходит!((( может кто ошибку найдет)
вот тоже чтото намудрил но проверку не проходит!((( может кто ошибку найдет)
поубирать все связаное с Ledcontrol все работает и выводит в сериал часы и минуты!
Еще раз Разберитесь с КАЖДЫМ устройством отдельно.
if(хотите просто поиграться){
я вам здесь не помошник
}
else if(хотите написать код который будет работать так как задуманно){
нужно понимать что Вы пишите и как это будет работать.
}
Простой пример у вас функция writeArduinoOn7Segment в ней вы пытаетесь разбить двухзначное десятичное число на отделные два знака чтобы записать в MAX7219 хотя:
DS3231 выдает значения времени и даты в формате BCD, а MAX7219 принимает на входе BCD
Еще раз Разберитесь с КАЖДЫМ устройством отдельно.
if(хотите просто поиграться){
я вам здесь не помошник
}
else if(хотите написать код который будет работать так как задуманно){
нужно понимать что Вы пишите и как это будет работать.
}
Простой пример у вас функция writeArduinoOn7Segment в ней вы пытаетесь разбить двухзначное десятичное число на отделные два знака чтобы записать в MAX7219 хотя:
DS3231 выдает значения времени и даты в формате BCD, а MAX7219 принимает на входе BCD
ок! пошел я в дебри, max7219 ковырять и разбиратся!
Нужна часть кода где с часов ds3231 считывается значение часов и воспроизводится через max7219 на 7-ми сегментнике!!! Скинь у кого есть хоть что то я под себе уже подгоню!
)))) ну ты упертый
Я делал вот так но с выводом на экран, посмотри можт поможет
)))) ну ты упертый
надо ж разобраться!) по отдельности с каждым устройством работать могу! Ты говоришь смотреть примеры! Смотрю например с часами в примерах вывод времени в serial! В ledcontrol для max7219 пропись букв и цифр! Как мне время вывести через max7219 на семисигментник в какой пример смотреть??? Поэтому я и создал тему чтоб может кто то скетч скинул! У всех просто lcd или матрицы 8x8!!!
Так бы и сказал.проверил по отдельности все рабочее.доеду дома объясню что делать дальше
ты просто число 1235 например можешь вывести? если приложи фото и код как выводил
Элементарный вопрос: как выложить число 123 просто на дисплей без бибилотеки?
для этого нужно знать как работает max7219
а если не хочешь знать, но хочешь чтобы работало, используешь либу
Пишу в этой ветке, т.к. в других пока тишина - случайно не работали с pt6961?
нет. зачем. max7219 же есть
ты просто число 1235 например можешь вывести? если приложи фото и код как выводил
что за сомнения вот код!
попробуй
хотя и не нравится мне этот кусок
он почти бесполезный. как будто чего то не хватает
пишут 62 24
похоже все зеркально ща поиграюсь!
вот так все четко)))
хотя и не нравится мне этот кусок
он почти бесполезный. как будто чего то не хватает
спасибо друг! дай бог тебе здоровья))) я ж говорь вроде понимаю как должно работать, а сказать т.е написать немогу))) спасибо еще раз!) осталось еще точки мигающие сделать)))
на этом все?
И еще вопрос с кнопками выставления времини(часов и минут) где то находил скетчи но уже не помню столько пересмотрел!
хочу все облагородить и сдель 2-ве кнопки для настройки! опять нужна помощь с кодом?!?!?!)))
смотри работа с кнопками на этом форуме
и узнай как в либе выставить время
смотри работа с кнопками на этом форуме
и узнай как в либе выставить время
что за либа?
либа для часов