7- cегментный дисплей для arduino

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

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

В итоге, что имеем: при 12 не светятся даже включённые, а при 13.2 уже начинают немного всетиться выключенные.

Т.е. остаётся узенькое окошечко и это плохо. Чуть малейшая нестабильность (чуть повысится или понизатся во время работы) и прибор идёт вразнос :(

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

Блин, а ведь в даташите написано падение напряжения 1.8. Не зря я сразу же Вам написал, что это подозрительно.

Итак, решение за Вами

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

2) ищем другие сдвиговые регистры, но тогда так, чтоби хватало честные 20мА подать на сегменты, чтобы светились на всю.

3 покупаем много транзисторов и вешаем по транзистору и паере резисторов на каждый сегмент. Опять же подаём 20мА на сегменты

Выбирайте, что делаем.

Кстати, повышающий DC-DC преобразователь нам понадобится по-любому, чтобы напряжение поднять. Какой? Это зависит от решения по трём пунктам выше.

 

protone77
Offline
Зарегистрирован: 02.10.2016

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

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

В итоге, что имеем: при 12 не светятся даже включённые, а при 13.2 уже начинают немного всетиться выключенные.

Т.е. остаётся узенькое окошечко и это плохо. Чуть малейшая нестабильность (чуть повысится или понизатся во время работы) и прибор идёт вразнос :(

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

Блин, а ведь в даташите написано падение напряжения 1.8. Не зря я сразу же Вам написал, что это подозрительно.

Итак, решение за Вами

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

2) ищем другие сдвиговые регистры, но тогда так, чтоби хватало честные 20мА подать на сегменты, чтобы светились на всю.

3 покупаем много транзисторов и вешаем по транзистору и паере резисторов на каждый сегмент. Опять же подаём 20мА на сегменты

Выбирайте, что делаем.

Кстати, повышающий DC-DC преобразователь нам понадобится по-любому, чтобы напряжение поднять. Какой? Это зависит от решения по трём пунктам выше.

 

он при 13.2 светится настолько слабо, что плохо видно в полностью темном помещенении. Так что я думаю 1 вариант сойдет, потому что при 13в не светятся вообще

Повыщающий преобразователь? Я думал что будет трансформатор с 220 до 13в или таких не бывает?

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

Ну, тогда ещё раз переповеряете чтобы при 13В боле 10мА. Причём чем точнее, тем лучше.

1 Ом, так один, 2 - так два, полтора, так полтора.

И закупаетесь резисторами на все сегменты. например, резистор на 1,5Ома в России стоит меньше рубля (российского).

Продолжайте выполнять мою инструкцию

Теперь определяете какой резистор нужен для двоеточия и тоже закупаетесь.

-------------

По поводу БП. Точно на 13 не бывает. Можно сделать, но при цене в полдоллара лучше не выпендриваться и купить готовый. Вы пока закажите, а работайте с Вашим БП. Пока сделаем и посылка приедет. Не обязательно покупать такой, можно и другой, лишь бы умел с 5 до 13 поднимать с точной настройкой. Этот умеет. Выходное напряжение подстроечным резистором выставляется.

protone77
Offline
Зарегистрирован: 02.10.2016

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

Ну, тогда ещё раз переповеряете чтобы при 13В боле 10мА. Причём чем точнее, тем лучше.

1 Ом, так один, 2 - так два, полтора, так полтора.

И закупаетесь резисторами на все сегменты. например, резистор на 1,5Ома в России стоит меньше рубля (российского).

Продолжайте выполнять мою инструкцию

Теперь определяете какой резистор нужен для двоеточия и тоже закупаетесь.

-------------

По поводу БП. Точно на 13 не бывает. Можно сделать, но при цене в полдоллара лучше не выпендриваться и купить готовый. Вы пока закажите, а работайте с Вашим БП. Пока сделаем и посылка приедет. Не обязательно покупать такой, можно и другой, лишь бы умел с 5 до 13 поднимать с точной настройкой. Этот умеет. Выходное напряжение подстроечным резистором выставляется.

перепроверил, при 1.5ом 10ма. 

И я заметил что в диапазонах 1.5ма до 10ма яркость этих светодиодов не изменялась, для чего тогда это всё?

http://www.rotr.info/electronics/mcu/seven_segment.htm вот тут прочитал,что увеличивая напряжение можно регулировать яркость свечения

со светодиодами я уже определился, нудно  150 ом.

А как будет подключатся этот преобразователь. От 5в ардуины получается будет повышать до 13в и на анод?

 

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

Вот 1.5 ома и покупайте в нужном количестве.

150, так 150 - нужен Вам всего один.

Ну, да. Его земля к земле блока питания (Вы же купили уже маленький такой на 5В?), вход - к выходу БП, а выход на общий анод. Точно 13В выставите отвёрточкой на резисторе, Вы уже руку набили :)

protone77
Offline
Зарегистрирован: 02.10.2016

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

Вот 1.5 ома и покупайте в нужном количестве.

150, так 150 - нужен Вам всего один.

Ну, да. Его земля к земле блока питания (Вы же купили уже маленький такой на 5В?), вход - к выходу БП, а выход на общий анод. Точно 13В выставите отвёрточкой на резисторе, Вы уже руку набили :)

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

ну как придет преобразователь куплю

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

protone77 пишет:

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

Тогда можно купить его, а можно на 12В - всё равно. На 12 можно найти дешевле, если без корпуса. Но 12 Вам мало, так что преобразователь всё равно нужен по-любому.

Ток - ну, от 600мА и больше

Сами выбирайте.

protone77
Offline
Зарегистрирован: 02.10.2016

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

protone77 пишет:

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

Тогда можно купить его, а можно на 12В - всё равно. На 12 можно найти дешевле, если без корпуса. Но 12 Вам мало, так что преобразователь всё равно нужен по-любому.

Ток - ну, от 600мА и больше

Сами выбирайте.

https://ru.aliexpress.com/item/HLK-PM01-AC-DC-220V-to-5V-Step-Down-Power...

я этот решил заказать.

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

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

Сейчас посчитаем поточнее, минутку.

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

Опньки, а боюсь, что этот не подойдёт.

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

На 600мА, но 12В - точно хватит, а этого нет.

Давайте считать:

если на всех цифрах зажечь восьмерки, имеем

28 сегментов по 10мА и 13 вольт, итого 28*0,01*13 = 3,64 ватта

Двоеточие - 5В и 10мА - 5*0,01 = 0,05

Ардуина 5В и 20мА - 5*0,02 = 0,1Вт

Итого, суммарно нужно 3,79 ватта

Учитывая, что 100% КПД не бывает, я бы смотрел не менее 5 ватт. 

У этого же блока питания всего 3 ватта - этого мало.

например БП 12В и 600мА - 12*0,6 = 7,2 ватта - подходит.

Ищите либо 5В от 1А и больше, либо 12В от 500мА и больше.

Понятно?

protone77
Offline
Зарегистрирован: 02.10.2016

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

На 600мА, но 12В - точно хватит, а этого нет.

Давайте считать:

если на всех цифрах зажечь восьмерки, имеем

28 сегментов по 10мА и 13 вольт, итого 28*0,01*13 = 3,64 ватта

Двоеточие - 5В и 10мА - 5*0,01 = 0,05

Ардуина 5В и 20мА - 5*0,02 = 0,1Вт

Итого, суммарно нужно 3,79 ватта

Учитывая, что 100% КПД не бывает, я бы смотрел не менее 5 ватт. 

У этого же блока питания всего 3 ватта - этого мало.

например БП 12В и 600мА - 12*0,6 = 7,2 ватта - подходит.

Ищите либо 5В от 1А и больше, либо 12В от 500мА и больше.

Понятно?

понятно http://belchip.by/product/?selected_product=17896 вот такой у себя нашел

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

Не сходите с ума. Это же трансформатор! Его выход - переменный ток. Вам его потом надо ещё выпрямлять и стабилизировать. Оно Вам надо? Тем более за такую цену!

Всё, что Вам нужно AC-DC преобразователь от 5 ватт. Вон, смотрите, сколько их (это только то, что первое попалось) и переделывать ничего не надо и в разы дешевле.

№1, №2, №3, №4, №5, №6, №7 и ещё 100500 разных.

Смотрите на геометрические размеры, цену, ну а там. где всё "ровненько", лучше прихватить лишний ваттик мощности - карман не тянет.

protone77
Offline
Зарегистрирован: 02.10.2016

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

Не сходите с ума. Это же трансформатор! Его выход - переменный ток. Вам его потом надо ещё выпрямлять и стабилизировать. Оно Вам надо? Тем более за такую цену!

Всё, что Вам нужно AC-DC преобразователь от 5 ватт. Вон, смотрите, сколько их (это только то, что первое попалось) и переделывать ничего не надо и в разы дешевле.

№1, №2, №3, №4, №5, №6, №7 и ещё 100500 разных.

Смотрите на геометрические размеры, цену, ну а там. где всё "ровненько", лучше прихватить лишний ваттик мощности - карман не тянет.

7 вариант наверное самый лучший. Цены-то почти одинаковые у всех

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

Ну, если по размеру подходит, то отлично - шестикратный запас по мощности - греться особо не будет :)

protone77
Offline
Зарегистрирован: 02.10.2016

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

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

Так, напомните текущую ситуацию, а то я уже запутался. Что у Вас есть, чего нет, что работает, а что - нет. Подробно и спокойно распишите.

protone77
Offline
Зарегистрирован: 02.10.2016

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

Так, напомните текущую ситуацию, а то я уже запутался. Что у Вас есть, чего нет, что работает, а что - нет. Подробно и спокойно распишите.

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

Из остального всё есть модуль часов, регисты, сегменты, резисторы, адруина и тд. До этого времени мы пытались узнать какой мне нужен резистор и от скольки вольт будет работать вся схема.

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

#include <iarduino_RTC.h>
iarduino_RTC time(RTC_DS3231);
void setup() {
    delay(300);
    Serial.begin(9600);
    time.begin();
}
void loop(){
    if(millis()%1000==0){ 
      Serial.println(time.gettime("H:i:s")); 
      delay(1);
         }
}

вот что у меня получилось.

Не знаю, что ещё подробней расписать).

соеденил я на макетке все свои регистры, только немного просчитался и нехватило пары проводов проводов на 4 резистр, надо сьездить докупить. Но потренироваться можно и с 3 индикаторами.

 

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

Хорошо. Докупайте. А пока.

Вы умеете на идикатор выводить те числа, которые Вам нужны?

protone77
Offline
Зарегистрирован: 02.10.2016

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

Хорошо. Докупайте. А пока.

Вы умеете на идикатор выводить те числа, которые Вам нужны?

да, но я работал пока с одним только

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

Ну, тогда начинайте работу с часами.

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

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

protone77
Offline
Зарегистрирован: 02.10.2016
#include <iarduino_RTC.h>
iarduino_RTC time(RTC_DS3231);
void setup() {
    delay(300);
    Serial.begin(9600);
    time.begin();
}
void loop(){
    if(millis()%1000==0){ 
      Serial.println(time.gettime("H:i:s")); 
      delay(1);
         }
}

вот. Я скидывал в 268 посте или это не правильно будет работать?

про подключение? ну питание всегда одинаково а scl к a5 , sda к а4

 

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

У этого скетча есть два недостатка.

1. Онн нагружает МК, который долже постоянно в loop что-то проверять и ни в коем случае нельзя задерживать loop

2. переключение происходит не точно, а тогда, когда Вы проверите свой миллис. Вот, например, если Вы в loop вставите delay(100500), то Ваши часы не будут переключаться 10,5 секунд.

Даже в самом лучше случае точность у Вас +/- полсекунды потому, что Вы переключать будете не тогда, когда часы переключились на новую минуту, а тогда, когда Вы спросите свой миллис. Вы понимаете?

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

1. Возьмите вот эту библиотеку.

2. Запустите вот такой скетч

#include <Wire.h>
#include <DS3231.h>

#define	PIN_SQW	3	// можно использовать 2 или 3 пин

static DS3231 Clock; // Собственно часы

//
//	Обработчик прерывания от часов, которое приходит при переходе минуты
//	Вообще-то гнать в сериал в обработчике прерывания - очень плохая идея,
//	Здесь это делается только чтобы не усложнять пример выводом на экран.
//	По уму, конечно, нужно на экран выводить.
//
static void everyMinuteAlarm(void) {
	const byte oldSReg = SREG;
	sei();
	Serial.print(Clock.getHour());
	Serial.print(":");
	Serial.println(Clock.getMinute());
	Clock.clearAlarmSignal(2);
	SREG = oldSReg;
}


void setup(void) {
	Serial.begin(115200);
	pinMode(PIN_SQW, INPUT);
	Wire.begin();
	Clock.setClockMode(false);	// Часы в 24-часовом режиме. Нужен 12-ти - пишем true
	Clock.turnOffAlarm(2);	//	Для очистки совести, мы не знаем что там часы делают
	Clock.EnableMinuteInterrupt();	// включаем ежеминутное прерывание
	attachInterrupt(PIN_SQW - 2, everyMinuteAlarm, FALLING);	// собираемся его обрабатывать
}

void loop(void) {}

Пин, который Вы укажете в строке 4, соедините с пином SQW модуля часов. Запустите и

1. Убедитесь, что работает

2. Убедитесь, что Вы всё понимаете.

protone77
Offline
Зарегистрирован: 02.10.2016

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

У этого скетча есть два недостатка.

1. Онн нагружает МК, который долже постоянно в loop что-то проверять и ни в коем случае нельзя задерживать loop

2. переключение происходит не точно, а тогда, когда Вы проверите свой миллис. Вот, например, если Вы в loop вставите delay(100500), то Ваши часы не будут переключаться 10,5 секунд.

Даже в самом лучше случае точность у Вас +/- полсекунды потому, что Вы переключать будете не тогда, когда часы переключились на новую минуту, а тогда, когда Вы спросите свой миллис. Вы понимаете?

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

1. Возьмите вот эту библиотеку.

2. Запустите вот такой скетч

#include <Wire.h>
#include <DS3231.h>

#define	PIN_SQW	3	// можно использовать 2 или 3 пин

static DS3231 Clock; // Собственно часы

//
//	Обработчик прерывания от часов, которое приходит при переходе минуты
//	Вообще-то гнать в сериал в обработчике прерывания - очень плохая идея,
//	Здесь это делается только чтобы не усложнять пример выводом на экран.
//	По уму, конечно, нужно на экран выводить.
//
static void everyMinuteAlarm(void) {
	const byte oldSReg = SREG;
	sei();
	Serial.print(Clock.getHour());
	Serial.print(":");
	Serial.println(Clock.getMinute());
	Clock.clearAlarmSignal(2);
	SREG = oldSReg;
}


void setup(void) {
	Serial.begin(115200);
	pinMode(PIN_SQW, INPUT);
	Wire.begin();
	Clock.setClockMode(false);	// Часы в 24-часовом режиме. Нужен 12-ти - пишем true
	Clock.turnOffAlarm(2);	//	Для очистки совести, мы не знаем что там часы делают
	Clock.EnableMinuteInterrupt();	// включаем ежеминутное прерывание
	attachInterrupt(PIN_SQW - 2, everyMinuteAlarm, FALLING);	// собираемся его обрабатывать
}

void loop(void) {}

Пин, который Вы укажете в строке 4, соедините с пином SQW модуля часов. Запустите и

1. Убедитесь, что работает

2. Убедитесь, что Вы всё понимаете.

cкетч скомпилировался, но время не показывает

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

1. В пин часов с пином ардуины соеднили? Правильные пины? Проверьте.

2. Потерпите. Он не сразу показывает. Он показывает тольуо при переходе минуты. Т.е. После запуска он может показать сразу, а может только через минуту - как повезёт. 

Проверяйте, особенно пины.

protone77
Offline
Зарегистрирован: 02.10.2016

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

1. В пин часов с пином ардуины соеднили? Правильные пины? Проверьте.

2. Потерпите. Он не сразу показывает. Он показывает тольуо при переходе минуты. Т.е. После запуска он может показать сразу, а может только через минуту - как повезёт. 

Проверяёте. особенно пины.

1. все верно

2. подождал, но всреавно не показывает. Я соеденил sqw с a3.

 И ещё я заметил в 32 строке, там указано pin_sqw-2 что это значит? в примере же указан пин 3.

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

С какого перепугу A3???

Просто 3-й цифровой пин - не аналоговый!

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

protone77 пишет:

 И ещё я заметил в 32 строке, там указано pin_sqw-2 что это значит? в примере же указан пин 3.

В той строке не номер пина, а номер прерывания. Прерывания бывают на двух пинах - на втором (у него номер 0) и на третьем - у него номер 1. Поэтому. чтобы из номера пина получить номер прерывания, нужно вычесть два.

Соедините правильно и проверьте, я жду.

protone77
Offline
Зарегистрирован: 02.10.2016

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

С какого перепугу A3???

Просто 3-й цифровой пин - не аналоговый!

исправил и мне показало в мониторе порта такую бкуву I

protone77
Offline
Зарегистрирован: 02.10.2016

scl к a5 , sda к а4 sqw к d3 но на плате он по счету 4( начинается же от 0) вот у меня так подключено. и в мониторе порта пишет набор букв

 

protone77
Offline
Зарегистрирован: 02.10.2016

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

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

Ага, Вы понимаете как оно работает? На пине 3 у Вас постоянно высокий уровень (HIGH) его туда подают часы. Точно при переходе минуты яасы прижимают этот пин к LOW. Это Вы ловите прерыванием. И именно в этот момент Вам нужно показывать новое время.

При таком подходе loop у Вас пустой. Можете поставить туда delay(100500) прерыванию пофигу - ничего не сломается. Часы будут переключаться точно когда нужно.

Вы всё понимаете как работает?

Тогда попробуйте выводить время на экран (пусть на три цифры - десятки часов пока не выводите). Покажете мне скетч.

protone77
Offline
Зарегистрирован: 02.10.2016

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

Ага, Вы понимаете как оно работает? На пине 3 у Вас постоянно высокий уровень (HIGH) его туда подают часы. Точно при переходе минуты яасы прижимают этот пин к LOW. Это Вы ловите прерыванием. И именно в этот момент Вам нужно показывать новое время.

При таком подходе loop у Вас пустой. Можете поставить туда delay(100500) прерыванию пофигу - ничего не сломается. Часы будут переключаться точно когда нужно.

Вы всё понимаете как работает?

Тогда попробуйте выводить время на экран (пусть на три цифры - десятки часов пока не выводите). Покажете мне скетч.

то что вы обьяснили я понимаю, но не совсем понимаю что значит каждая комманда в скетче, где можно найти описание каждой комманды этой библиотке? и ещё я заметил время выводится неарвильно. 19:1 19:2 и тд. Ну мне с моими дисплеями как раз пойдет). Завтра уделю и постараюсь сделать. Только я всреавно не понимаю как регист поймет какие сегменты включать, а какие нет? Раньше же я сам просто цифры строил, но с часами такое не пойдет

protone77
Offline
Зарегистрирован: 02.10.2016

Мне все делать в сетапе, луп не трогать, да? вы писали,что это мк нагружает

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

protone77 пишет:

неарвильно. 19:1 19:2 и тд. 

Почему неправильно? Числа правильные, а как их выводить - это уже дело программиста. В пробе с сериалом нам особая красота не нужна, вот никто и не парится. Числа-то правильные. Этого и добивались.

protone77 пишет:

не понимаю как регист поймет какие сегменты включать, а какие нет?

Никак не поймет. Это Вы должны делать.

Вы знаете какие биты надо взвести, чтобы показать тот или иной сегмент? Можете выписать (тролько правильно) такую последовательность

#define SEG_A 0x01
#define SEG_A 0x02
#define SEG_A 0x04
....

Или, если Вам удобнее, то так

#define SEG_A 00000001b
#define SEG_A 00000010b
#define SEG_A 00000100b
...

Выпишите все сегменты.

Затем выпишите все цифры по сегментам. Должно получиться что-то вроде такого (возможно, если у Вас свечение задаётся 0, а не 1, то нужно будет | поменять на &

#define SYMBOL_0 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F)
#define SYMBOL_1 (SEG_B | SEG_C)
#define SYMBOL_2 (SEG_A | SEG_B | SEG_D | SEG_E | SEG_G)
#define SYMBOL_3 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_G)
#define SYMBOL_4 (SEG_B | SEG_C | SEG_F | SEG_G)
#define SYMBOL_5 (SEG_A | SEG_C | SEG_D | SEG_F | SEG_G)
#define SYMBOL_6 (SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_7 (SEG_A | SEG_B | SEG_C)
#define SYMBOL_8 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_9 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G)
Теперь, если Вы правильно выписали все SEG_?, то Вы можете выводить в регистр байт SYMBOL_6   и при этом должна загораться шестёрка.

Это Вы можете сделать?

protone77
Offline
Зарегистрирован: 02.10.2016

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

protone77 пишет:

неарвильно. 19:1 19:2 и тд. 

Почему неправильно? Числа правильные, а как их выводить - это уже дело программиста. В пробе с сериалом нам особая красота не нужна, вот никто и не парится. Числа-то правильные. Этого и добивались.

protone77 пишет:

не понимаю как регист поймет какие сегменты включать, а какие нет?

Никак не поймет. Это Вы должны делать.

Вы знаете какие биты надо взвести, чтобы показать тот или иной сегмент? Можете выписать (тролько правильно) такую последовательность

#define SEG_A 0x01
#define SEG_A 0x02
#define SEG_A 0x04
....

Или, если Вам удобнее, то так

#define SEG_A 00000001b
#define SEG_A 00000010b
#define SEG_A 00000100b
...

Выпишите все сегменты.

Затем выпишите все цифры по сегментам. Должно получиться что-то вроде такого (возможно, если у Вас свечение задаётся 0, а не 1, то нужно будет | поменять на &

#define SYMBOL_0 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F)
#define SYMBOL_1 (SEG_B | SEG_C)
#define SYMBOL_2 (SEG_A | SEG_B | SEG_D | SEG_E | SEG_G)
#define SYMBOL_3 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_G)
#define SYMBOL_4 (SEG_B | SEG_C | SEG_F | SEG_G)
#define SYMBOL_5 (SEG_A | SEG_C | SEG_D | SEG_F | SEG_G)
#define SYMBOL_6 (SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_7 (SEG_A | SEG_B | SEG_C)
#define SYMBOL_8 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define SYMBOL_9 (SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G)
Теперь, если Вы правильно выписали все SEG_?, то Вы можете выводить в регистр байт SYMBOL_6   и при этом должна загораться шестёрка.

Это Вы можете сделать?

да, все зааботало

#include <Wire.h>
#include <SPI.h>
#include <DS3231.h>
#define latchpin  10
#define clockpin  13
#define datapin  11
#define  PIN_SQW 3
#define SEG_A 0b10111111
#define SEG_B 0b11011111
#define SEG_C 0b11101111
#define SEG_D 0b11110111
#define SEG_E 0b11111011
#define SEG_F 0b11111101
#define SEG_G 0b11111110
#define SYMBOL_0 (SEG_A & SEG_B & SEG_C & SEG_D & SEG_E & SEG_F)
#define SYMBOL_1 (SEG_B & SEG_C)
#define SYMBOL_2 (SEG_A & SEG_B & SEG_D & SEG_E & SEG_G)
#define SYMBOL_3 (SEG_A & SEG_B & SEG_C & SEG_D & SEG_G)
#define SYMBOL_4 (SEG_B & SEG_C & SEG_F & SEG_G)
#define SYMBOL_5 (SEG_A & SEG_C & SEG_D & SEG_F & SEG_G)
#define SYMBOL_6 (SEG_A & SEG_C & SEG_D & SEG_E & SEG_F & SEG_G)
#define SYMBOL_7 (SEG_A & SEG_B & SEG_C)
#define SYMBOL_8 (SEG_A & SEG_B & SEG_C & SEG_D & SEG_E & SEG_F & SEG_G)
#define SYMBOL_9 (SEG_A & SEG_B & SEG_C & SEG_D & SEG_F & SEG_G)
static DS3231 Clock; // Собственно часы

static void everyMinuteAlarm(void) {
  const byte oldSReg = SREG;
  sei();
  Serial.print(Clock.getHour());
  Serial.print(":");
  Serial.println(Clock.getMinute());
  Clock.clearAlarmSignal(2);
  SREG = oldSReg;
}

void setup(void) {
  Serial.begin(115200);
  pinMode(PIN_SQW, INPUT);
  Wire.begin();
  Clock.setClockMode(false);  // Часы в 24-часовом режиме. Нужен 12-ти - пишем true
  Clock.turnOffAlarm(2);  //  Для очистки совести, мы не знаем что там часы делают
  Clock.EnableMinuteInterrupt();  // включаем ежеминутное прерывание
  attachInterrupt(PIN_SQW - 2, everyMinuteAlarm, FALLING);  // собираемся его обрабатывать
  SPI.begin();
   SPI.setBitOrder(LSBFIRST);
   pinMode(clockpin, OUTPUT);
   pinMode(datapin, OUTPUT);
   pinMode(latchpin, OUTPUT);
   digitalWrite(latchpin, LOW); 
    SPI.transfer( SYMBOL_9); 
    digitalWrite(latchpin, HIGH);
}



void loop() {
   

}

 

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

Ну, вот и прекрасно, теперь Вы можете завести массив типа такого

static const uint8_t allDigits[] = { SYMBOL_0, SYMBOL_1, ... SYMBOL_9};

И когда Вам нужно вывести цифру N спокойно пихаете в SPI байт allDigits[N]

Например, если у Вас часы - это дальние от ардуины регистры, а минуты ближние, и у Вас есть время в двух переменных h и m, то вывести его можно очень просто. Пихаете в SPI последовательно

allDigits[h / 10]

allDigits[h % 10]

allDigits[m / 10]

allDigits[m % 10]

И всё. 

Попробуйте.

 

 

protone77
Offline
Зарегистрирован: 02.10.2016

 

 

 

protone77
Offline
Зарегистрирован: 02.10.2016

все, сделал.

#include <Wire.h>
#include <SPI.h>
#include <DS3231.h>
#define latchpin  10
#define clockpin  13
#define datapin  11
#define  PIN_SQW 3
#define SEG_A 0b10111111
#define SEG_B 0b11011111
#define SEG_C 0b11101111
#define SEG_D 0b11110111
#define SEG_E 0b11111011
#define SEG_F 0b11111101
#define SEG_G 0b11111110
#define SYMBOL_0 (SEG_A & SEG_B & SEG_C & SEG_D & SEG_E & SEG_F)
#define SYMBOL_1 (SEG_B & SEG_C)
#define SYMBOL_2 (SEG_A & SEG_B & SEG_D & SEG_E & SEG_G)
#define SYMBOL_3 (SEG_A & SEG_B & SEG_C & SEG_D & SEG_G)
#define SYMBOL_4 (SEG_B & SEG_C & SEG_F & SEG_G)
#define SYMBOL_5 (SEG_A & SEG_C & SEG_D & SEG_F & SEG_G)
#define SYMBOL_6 (SEG_A & SEG_C & SEG_D & SEG_E & SEG_F & SEG_G)
#define SYMBOL_7 (SEG_A & SEG_B & SEG_C)
#define SYMBOL_8 (SEG_A & SEG_B & SEG_C & SEG_D & SEG_E & SEG_F & SEG_G)
#define SYMBOL_9 (SEG_A & SEG_B & SEG_C & SEG_D & SEG_F & SEG_G)
static DS3231 Clock; // Собственно часы

static void everyMinuteAlarm(void) {
  const byte oldSReg = SREG;
  sei();
  Serial.print(Clock.getHour());
  Serial.print(":");
  Serial.println(Clock.getMinute());
  Clock.clearAlarmSignal(2);
  SREG = oldSReg;
}

void setup(void) {
  Serial.begin(9600);
  pinMode(PIN_SQW, INPUT);
  Wire.begin();
  Clock.setClockMode(false);  // Часы в 24-часовом режиме. Нужен 12-ти - пишем true
  Clock.turnOffAlarm(2);  //  Для очистки совести, мы не знаем что там часы делают
  Clock.EnableMinuteInterrupt();  // включаем ежеминутное прерывание
  attachInterrupt(PIN_SQW - 2, everyMinuteAlarm, FALLING);  // собираемся его обрабатывать
  SPI.begin();
   SPI.setBitOrder(LSBFIRST);
   pinMode(clockpin, OUTPUT);
   pinMode(datapin, OUTPUT);
   pinMode(latchpin, OUTPUT);
   static const uint8_t allDigits[] = { SYMBOL_0, SYMBOL_1,SYMBOL_2,SYMBOL_3,SYMBOL_4,SYMBOL_5,SYMBOL_6,SYMBOL_7,SYMBOL_8,SYMBOL_9};
   digitalWrite(latchpin, LOW); 
        
    SPI.transfer( allDigits[Clock.getMinute()%10]); 
    SPI.transfer( allDigits[Clock.getHour()%10]);
    SPI.transfer( allDigits[Clock.getHour()/10]); 
   digitalWrite(latchpin, HIGH);
    
}



void loop(void) {
   

}

 

 

 

 
protone77
Offline
Зарегистрирован: 02.10.2016

вот что я кстати заметил, когда я подключил 3 сегмента, они начали светится ярко даже при 10.6-11в( но потребление тока меньше 0.01а)с моими резисторами по 1.5ома я начал увеличивать напряжение и где-то на 11.4-11.5 показало 0.01 ампера, хотя когда был включен один сегмент и один регистр 0.01 ампер был при 12.3-12.5 вольтах.

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

protone77 пишет:

вот что я кстати заметил, когда я подключил 3 сегмента, они начали светится ярко даже при 10.6-11в( но потребление тока меньше 0.01а)с моими резисторами по 1.5ома я начал увеличивать напряжение и где-то на 11.4-11.5 показало 0.01 ампера, хотя когда был включен один сегмент и один регистр 0.01 ампер был при 12.3-12.5 вольтах.

Немного странно, но мы об этом подумаем. Пока же, доделайте скетч по нормальному. Я не об этом Вас просил.

Сделайте следующее.

1. Оформите функцию с названием ита showTime(). Она должна:
  а) спрашивать время у часов 
  б) показывать это время на индиакторе

Только не надо спрашивать у часов одно и то же дважды подряд, как Вы это делаете в строках 54-55. Спросите один раз, присвойте переменной, а дольше работайте с этой переменной.

Массив allDigits засуньте внутрь этой функции, он ведь только там нужен, так и нечего ему снаружи отвечивать.

2. Вызывайте эту функцию один раз в setup, после инициализации SPI и один раз в everyMinuteAlarm

А печать в сериал уберите вовсе.

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

protone77
Offline
Зарегистрирован: 02.10.2016

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

protone77 пишет:

вот что я кстати заметил, когда я подключил 3 сегмента, они начали светится ярко даже при 10.6-11в( но потребление тока меньше 0.01а)с моими резисторами по 1.5ома я начал увеличивать напряжение и где-то на 11.4-11.5 показало 0.01 ампера, хотя когда был включен один сегмент и один регистр 0.01 ампер был при 12.3-12.5 вольтах.

Немного странно, но мы об этом подумаем. Пока же, доделайте скетч по нормальному. Я не об этом Вас просил.

Сделайте следующее.

1. Оформите функцию с названием ита showTime(). Она должна:
  а) спрашивать время у часов 
  б) показывать это время на индиакторе

Только не надо спрашивать у часов одно и то же дважды подряд, как Вы это делаете в строках 54-55. Спросите один раз, присвойте переменной, а дольше работайте с этой переменной.

Массив allDigits засуньте внутрь этой функции, он ведь только там нужен, так и нечего ему снаружи отвечивать.

2. Вызывайте эту функцию один раз в setup, после инициализации SPI и один раз в everyMinuteAlarm

А печать в сериал уберите вовсе.

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

я сейчас ухожу так что задам пару вопросов сразу. 

1. У вас есть ссылки на команды и что они делают в библиотке часов(которую вы скидывали)

я в программировании не силен так что не совсем всё понял

про функцию showtime она получается будет вместо 30-33 строк?

массив alldigits запихнуть в шоутайм?

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

Ну, это стандартная библиотека взятая с гитхаба. Что-то описано в самом коде, посмотрите. Там же должна быть ссылка на гитхаб, может там ещё есть какая документация. Сам я добавил в неё только функцию EnableMinuteInterrupt, она как раз инструктирует часы. чтобы те выдавали прерывание раз в минуту.

Функция о которой я говорю - это по сути Ваши строки 50-56. ТОлько их надо офрмить отдельной функцией и не спрашивать одно и тоже дважды. Саму функцию расположите повыше в коде. Можно прямо после строки 25.

А вызывает её нужно, да, вместо строк 30-32 и вместо строк 50-56.

protone77
Offline
Зарегистрирован: 02.10.2016


#include <Wire.h>
#include <SPI.h>
#include <DS3231.h>
#define latchpin  10
#define clockpin  13
#define datapin  11
#define  PIN_SQW 3
#define SEG_A 0b10111111
#define SEG_B 0b11011111
#define SEG_C 0b11101111
#define SEG_D 0b11110111
#define SEG_E 0b11111011
#define SEG_F 0b11111101
#define SEG_G 0b11111110
#define SYMBOL_0 (SEG_A & SEG_B & SEG_C & SEG_D & SEG_E & SEG_F)
#define SYMBOL_1 (SEG_B & SEG_C)
#define SYMBOL_2 (SEG_A & SEG_B & SEG_D & SEG_E & SEG_G)
#define SYMBOL_3 (SEG_A & SEG_B & SEG_C & SEG_D & SEG_G)
#define SYMBOL_4 (SEG_B & SEG_C & SEG_F & SEG_G)
#define SYMBOL_5 (SEG_A & SEG_C & SEG_D & SEG_F & SEG_G)
#define SYMBOL_6 (SEG_A & SEG_C & SEG_D & SEG_E & SEG_F & SEG_G)
#define SYMBOL_7 (SEG_A & SEG_B & SEG_C)
#define SYMBOL_8 (SEG_A & SEG_B & SEG_C & SEG_D & SEG_E & SEG_F & SEG_G)
#define SYMBOL_9 (SEG_A & SEG_B & SEG_C & SEG_D & SEG_F & SEG_G)
int h,m;
static DS3231 Clock; // Собственно часы

void showTime(){
  Serial.print(Clock.getHour());
   h=Clock.getHour();
  Serial.print(":");
  Serial.println(Clock.getMinute());
  m=Clock.getMinute();
  static const uint8_t allDigits[] = { SYMBOL_0, SYMBOL_1,SYMBOL_2,SYMBOL_3,SYMBOL_4,SYMBOL_5,SYMBOL_6,SYMBOL_7,SYMBOL_8,SYMBOL_9};
  digitalWrite(latchpin, LOW);       
  SPI.transfer( allDigits[m%10]); 
  SPI.transfer( allDigits[h%10]);
  SPI.transfer( allDigits[h/10]); 
  digitalWrite(latchpin, HIGH);
  
  }

static void everyMinuteAlarm(void) {
  const byte oldSReg = SREG;
  sei();
  showTime();
  Clock.clearAlarmSignal(2);
  SREG = oldSReg;
}

void setup(void) {
  Serial.begin(115200);
  pinMode(PIN_SQW, INPUT);
  Wire.begin();
  Clock.setClockMode(false);  // Часы в 24-часовом режиме. Нужен 12-ти - пишем true
  Clock.turnOffAlarm(2);  //  Для очистки совести, мы не знаем что там часы делают
  Clock.EnableMinuteInterrupt();  // включаем ежеминутное прерывание
  attachInterrupt(PIN_SQW - 2, everyMinuteAlarm, FALLING);  // собираемся его обрабатывать
  SPI.begin();
   SPI.setBitOrder(LSBFIRST);
   pinMode(clockpin, OUTPUT);
   pinMode(datapin, OUTPUT);
   pinMode(latchpin, OUTPUT);
   showTime();
      
    
}



void loop(void) {
   

}

 

 

protone77
Offline
Зарегистрирован: 02.10.2016

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

protone77
Offline
Зарегистрирован: 02.10.2016

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
1. Строки 61-63 убрать. SPI и без Вас это сделает.
2. Строки 29, 31, 32 убрать, время должно показываться на экране часов, Зачем Вам сериал?
3. Строку 25 внести внутрь функции showTime, сразу после строки 28. Чего это объявление забыло снаружи, если переменные используются только внутри функции?
 
По поводу "сбивается". Ищите сопли на макетке. Код нормальный. Земля у БП (от которого питается экран)  и Ардуины общая, я надеюсь? Не забыли сделать её общей?
protone77
Offline
Зарегистрирован: 02.10.2016

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

1. Строки 61-63 убрать. SPI и без Вас это сделает.
2. Строки 29, 31, 32 убрать, время должно показываться на экране часов, Зачем Вам сериал?
3. Строку 25 внести внутрь функции showTime, сразу после строки 28. Чего это объявление забыло снаружи, если переменные используются только внутри функции?
 
По поводу "сбивается". Ищите сопли на макетке. Код нормальный. Земля у БП (от которого питается экран)  и Ардуины общая, я надеюсь? Не забыли сделать её общей?

я пересобрал полностью всё и заработало, похоже какой-то провод отсоеденился. всё в коде исправил. Что дальше делать

 

protone77
Offline
Зарегистрирован: 02.10.2016

мне на днях обещали подкинуть dht22 думаю подключить тоже этот датчик и выводить температуру и влажность. И ещё я забыл про двоеточие. 

Просто, которое горит постоянно сделать проще, а если мигать им, то через дилей или как?

 

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

Температуру, если она Вам нужна сама ардуина тоже умеете измерять.

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

А что сейчас делать.

1. Продумать что Вы хотите от сових часов. Продумать и выписать все фичи и возможности (например, про темепратуру я сегодня впервые услышал).

2. Когда всё выписано, потихоньку делать всё шаг за шагом.

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

4. Закончить программирование и сделать корпус