Вопрос по коду для простых часов на семисегментном индикатор
- Войдите на сайт для отправки комментариев
Пнд, 07/11/2016 - 15:36
Добрый день!
Прошу подсказать, что я сделал не так, никак не могу понять...
Есть семисегментный индикатор, отдельно выводить разные цифры - получается, а вот чередовать - нет
Сам код
int i;
void setup() {
// put your setup code here, to run once:
pinMode(2,OUTPUT); //Вывод + на 1 сегмент
pinMode(3,OUTPUT); // Вывод + на 2 сегмент
pinMode(7,OUTPUT); //Выводы на индиакторы сегментов
pinMode(8,OUTPUT);//Выводы на индиакторы сегментов
pinMode(9,OUTPUT);//Выводы на индиакторы сегментов
pinMode(10,OUTPUT);//Выводы на индиакторы сегментов
pinMode(11,OUTPUT);//Выводы на индиакторы сегментов
pinMode(12,OUTPUT);//Выводы на индиакторы сегментов
pinMode(13,OUTPUT);//Выводы на индиакторы сегментов
i=0;//Счетчик
}
void loop()
{
click1(); //отключаем второй сегмент и включаем первый
if(i<500){
ONE(); // Пишем цифру 1,
}
if((i>=500)&&(i<1000));
{
TWO(); // Через некоторое время - 2
}
if ((i>=1000)&&(i<1500))
{
THREE(); // А теперь - три
}
if(i>=1500) // Обнуляем счетчик
{
i=0;
}
click2(); // Выключаем первый сегмент и включаем второй
TWO(); // пишем цифру 2
i=i+1; // Добавляем единицу счетчику
}
void click1()
{
delay(2);
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
}
void click2()
{
delay(2);
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
}
void ONE()
{
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
digitalWrite(7, LOW);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
}
void TWO()
{
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(7, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, HIGH);
}
void THREE()
{
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(7, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
}
https://ru.aliexpress.com/store/product/20pcs-lot-0-4-Four-Digital-Clock-Display-Green-Color-Seven-Segment-Digital-Display-Common-Cathode/406986_2015796655.html?detailNewVersion=&categoryId=541
Это сам индикатор
Вот даташит...
https://yadi.sk/d/a3chks5RyDLn4
А зачем Вы в строке 42 выводите двойку и всё своё "чередование" ею затираете?
И, кстати, 500 - это очень мало по времени. Сделайте хотя бы 10000 (как раз int хватит).
500 я взял, т.к. мне была нужна секунда. Там же два раза delay по 1, следовательно, когда 500 раз они повторятся, будет 1000, т.е. секуда.
Строка 42 включает цифру второго сегмента ( их же там 4)
Но она же не обнуляет счетчик... или я что-то не понимаю?
Так как у всех четырех частей/сегментов общий плюс, то включать их можно только циклически, с минимальным интервалом (чтоб мерцание не было заметно глазу).
Да, в delay изначально была единица)))
Поменял код, заменив счетчик на millis();
int i; int t; void setup() { // put your setup code here, to run once: pinMode(2,OUTPUT); //Вывод + на 1 сегмент pinMode(3,OUTPUT); // Вывод + на 2 сегмент pinMode(7,OUTPUT); //Выводы на индиакторы сегментов pinMode(8,OUTPUT);//Выводы на индиакторы сегментов pinMode(9,OUTPUT);//Выводы на индиакторы сегментов pinMode(10,OUTPUT);//Выводы на индиакторы сегментов pinMode(11,OUTPUT);//Выводы на индиакторы сегментов pinMode(12,OUTPUT);//Выводы на индиакторы сегментов pinMode(13,OUTPUT);//Выводы на индиакторы сегментов i=0; t=0; } void loop() { t=(millis()-i); click1(); //отключаем второй сегмент и включаем первый if(t<1000){ ONE(); // Пишем цифру 1, } if((t>=1000)&&(i<2000)); { TWO(); // Через некоторое время - 2 } if ((t>=2000)and(i<3000)) { THREE(); // А теперь - три } if(t>=3000) // Обнуляем счетчик { i=millis(); t=0; } click2(); // Выключаем первый сегмент и включаем второй TWO(); // пишем цифру 2 } void click1() { delay(10); digitalWrite(2, HIGH); digitalWrite(3, LOW); } void click2() { delay(10); digitalWrite(2, LOW); digitalWrite(3, HIGH); } void ONE() { digitalWrite(7, HIGH); digitalWrite(8, LOW); digitalWrite(7, LOW); digitalWrite(9, HIGH); digitalWrite(10, HIGH); digitalWrite(11, HIGH); digitalWrite(12, HIGH); digitalWrite(13, HIGH); } void TWO() { digitalWrite(7, HIGH); digitalWrite(8, HIGH); digitalWrite(7, HIGH); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, HIGH); digitalWrite(12, HIGH); digitalWrite(13, HIGH); } void THREE() { digitalWrite(7, HIGH); digitalWrite(8, HIGH); digitalWrite(7, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, LOW); }Теперь картина еще интереснее.
Показывает 1, потом 3 (в первом сегменте, во втором, как и планировал по коду, пока только единица).
потом длинная пауза, секунд 20.
потом 1 (две секунды) 3 ...(повторяется раз 10) и опять длинная пауза...
Есть семисегментный индикатор, отдельно выводить разные цифры - получается, а вот чередовать - нет
чередовать - это как?
у тебя же подключен один индиктор(сюдя по коду)... или это подлючены параллельно два индикатора?
если так, то на эти два, параллельно подключенных индикатора возможно вывести только две одинаковые цифры.
Один четырехразрядный.
Разные цифры получается ставить в разные разряды.
А вот чередовать цифры в одном разряде, не получается. Что-то делаю не так с кодом
На все четыре разряда общие плюсы.
Поэтому, цифры должны включаться и выключаться попеременно. Иначе не получится включить в разных разрядах разные цифры.
Т.е. сперва горит первый разряд, другие выключены.
Потом второй, первый, третий и четвертый выключены и т.п.
http://www.cohesivecomputing.co.uk/hackatronics/arduino-multi-function-shield/part-3/
/* Пример использования 4-х значного 7-ми сегментного индикатора на многофункциональной плате Multi_function_Shield 2х МС74НС595 АD ->4 семисегментных индикатора QA1-1;QB1-2;QC1-3;QD1-4;QE1-NC;QF1-NC;QG1-NC;QH1-NC QA2-a;QB2-b;QC2-c;QD2-d;QE2-e; QF2-f; QG2-g; QH2-h DATA ->8 (Data_pin) CLK ->7 (CLK_pin) LATCH ->4 (LATCH_pin) */ //#1 счетчик uint8_t Count; // счетчик //#2 const int Latch_pin=4; const int CLK_pin =7; const int Data_pin =8; // матрица цифр 0 to 9 const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90}; // матрица выбора знакоместа 1 to 4 const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8}; // Вывод числа на экран void WriteNumber(int Number) { WriteNumberToSegment(0 , Number / 1000); WriteNumberToSegment(1 , (Number / 100) % 10); WriteNumberToSegment(2 , (Number / 10) % 10); WriteNumberToSegment(3 , Number % 10); } // запись нужного числа (0-9) в нужную позицию(1-4) void WriteNumberToSegment(byte Segment, byte Value){ digitalWrite(Latch_pin,0); shiftOut(Data_pin, CLK_pin, MSBFIRST, SEGMENT_MAP[Value]); shiftOut(Data_pin, CLK_pin, MSBFIRST, SEGMENT_SELECT[Segment] ); digitalWrite(Latch_pin,1); } void setup () { //#1 Count = 0; //#2 pinMode(Latch_pin,OUTPUT); pinMode(CLK_pin,OUTPUT); pinMode(Data_pin,OUTPUT); } void loop(){ static uint32_t MILLIS ; MILLIS = millis() ; //#1 100 милисек счетчик static uint32_t future1 = 0 ; if (MILLIS >= future1) { future1 = MILLIS + 100 ; Count++; if(Count > 9999) Count = 0; } //#2 непрерывно дисплей WriteNumber(Count); }Один четырехразрядный.
Разные цифры получается ставить в разные разряды.
дык, не получается - получается рулить анодами разрядов. если аноды не отключать во всех разрядах будет одна цифра.
А вот чередовать цифры в одном разряде, не получается. Что-то делаю не так с кодом
ну, я тоже не вижу 4-х переменных разрядов и условий их индикации типо: светим 1-й разряд - анод в нужное положение, сегменты в нужное положение... и тд. 2-й разряд... 4-й разряд
Почему нет?
Я же сделал функции ckick1 и click2 для первого и второго разрядов (для 3 и 4 пока не делал)
Почему нет?
Я же сделал функции ckick1 и click2 для первого и второго разрядов (для 3 и 4 пока не делал)
а это кто будет делать?
сегменты в нужное положение... и тд. 2-й разряд... 4-й разряд
у тебя переключаются аноды разрядов, а состояния пинов сегментов, рисующих цифру, остаются без изменений
*!!! у тебя там путаница в названиях сущностей, возможно поэтому запутался?
pinMode(7,OUTPUT);//Выводы на индиакторы сегментовpinMode(2,OUTPUT);//Вывод + на 1 сегментсегменты - это рисочки разряда из которых строится цифра.
разряд - это 7-мь сегментов(не будем считать точки пока), физически расположенные в одном разряде.
pinMode(2,OUTPUT);//Вывод + на 7-мь сегментовДа, виноват, неправильно написал.
2 и 3 вывод на управляющие аноды разрядов,а не сегменты...
Когда меняю одну цифру на другую в одном сегменте (при этом другой сегмент статичен) всё работает.
Как только цифр уже больше двух(в одном ссегменте), пытаюсь посчитать секунды, начинается какая-то свисто-пляска.
та намутил ты с переключалкой цифр - не будет она у тебя работать
так попробуй
unsigned long stop = millis(); unsigned long start = stop; void loop() { stop = millis(); if (stop - start > 1000) {start = stop; // что-то делаем каждые 1000 миллисекунд } }или подключи к балалайке пару кнопок - будет проще кнопками цифры переключать
Спасибо!! Так теперь работает! Клапауций просто гений!)