Семисегментный индикатор. Теория управления
- Войдите на сайт для отправки комментариев
Чт, 30/01/2014 - 18:52
Добрый день форумчане. Столкнулся с проблемой. Как можно выводить цифры на индикатор используя ардуинку?
Самое простое это зажигать в нужный момент диод. Это понятно. Интересует вопросы, такие как например люди используют для зажигания какой-либо цифры с помощью шестадцетиричного числа или двоичного?
Например вот
0x3f, //0
0x06, //1
0x5b, //2
0x4f, //3
0x66, //4
0x6d, //5
0x7d, //6
0x07, //7
0x7f, //8
0x6f //9
Не могу разобраться. Каким образом ардуина поймет это? Объясните пожалуйста.
7-сегментный индикатор. Поиск в гугле выдает кучу уроков, схем и т.п.
Исследование индикаторов, лабораторный практикум
Обозначение сегментов семисегментного индикатора:
цифра "1", например - это зажженные сегменты B и C, то есть второй (первый при отсчете от нуля) и третий (второй при отсчете от нуля). Такую комбинацию можно представить числом 6 (в двоичном представлении - B00000110, в шестнадцатиричном - 0x06). По такому же алгоритму попробуйте "отобразить" любую из приведенных вами комбинаций. Возможно, наступит прозрение...
Спасибо все, сейчас попробую!)
Есть такая библиотека Arduino-SevenSegmentDisplay
С ней удобнее работать с индикаторами.
А еще лучше, брать индикаторы с MAX2119 и LedControl библиотеку. Там любое количество индикаторов по трем проводам подключается
хмм.. Тогда следующий вопрос, куда надо будет подавать бинарник чтобы он зажег определенные сегменты?
Если у нас есть 7 портов, то я так понял на них надо подать бинарник как-то? или я чего-то не понимаю?
Оказывается, посмотрел я на циколевку атмеги. Увидел что все порты делятся на категории, PORTA, PORTB и PORTC
Ну я подключил 8 ножек индикатора к PORTD - это 0-7 ноги arduino UNO
Сказал чтобы эти порты, 0-7, были выводами и просто потом на PORTD отправлял бинарник или HEX
PORTB=0x3F - это ноль на индикаторе.
Вопрос такой, а почему нельзя в процедуре setup указать pinMode(PORTD,OUTPUT); ? Может кто сказать?
Ухты, и правда есть что-то вроде короткой записи в пины бинарным образом
http://www.arduino.cc/en/Reference/PortManipulation
x= коду цифры
цикл 0-7
вывод на пин (i, x& 0x01)
x>>=1
Оказывается, я посмотрел на циколевку атмеги. Увидел что все порты делятся на категории, PORTA, PORTB и PORTC
Ну я подключил 8 ножек индикатора к PORTD - это 0-7 ноги arduino UNO
Сказал чтобы эти порты, 0-7, были выводами и просто потом на PORTD отправлял бинарник или HEX
PORTB=0x3F - это ноль на индикаторе.
Вопрос такой, а почему нельзя в процедуре setup указать pinMode(PORTD,OUTPUT); ? Может кто сказать?
забудьте эти ассемблерные стилевые приемчики PORTC в борьбе за скорость лишнее это
пишите в С стиле потому как быстрее результат
например эфективен такой стиль С с подпрограммками с удобненькой функцией миллис
это дооооолгий таймер и трясущиеся семисегментники без упрощающего код драйверочка max7219
совмещено казалось бы такое разноскоростное автор так выделиывался с циферками
тут не самый быстрый стиль подумал написал спаял продал
но он вам покажет как писать со всякими извращениями фантазиями
не помню где-то пример этот лежит постоянно
это у меня с диска
// ========[ Контакты]=========== const int a = 5; const int b = 7; const int c = 2; const int d = 4; const int e = 3; const int f = 0; const int g = 6; const int h = 1; const int led1 = 9; const int led2 = 10; const int led3 = 8; const int ON = высокая; const int OFF = LOW; const int regulatorPin = A0; const int focusPin = A1; const int cameraPin = A2; const int showLedDelay = 7; const int LedsDelay = 10000; // =========================== const int символов[12][8] = { // f h c e d a g b {ON, OFF, ON, ON, ON, ON, OFF, ON}, // 0 {OFF, OFF, ON, OFF, OFF, OFF, OFF, ON}, // 1 {OFF, OFF, OFF, ON, ON, ON, ON, ON}, // 2 {OFF, OFF, ON, OFF, ON, ON, ON, ON}, // 3 {ON, OFF, ON, OFF, OFF, OFF, ON, ON}, // 4 {ON, OFF, ON, OFF, ON, ON, ON, OFF}, // 5 {ON, OFF, ON, ON, ON, ON, ON, OFF}, // 6 {OFF, OFF, ON, OFF, OFF, ON, OFF, ON}, // 7 {ON, OFF, ON, ON, ON, ON, ON, ON}, // 8 {ON, OFF, ON, OFF, ON, ON, ON, ON}, // 9 {ON, OFF, OFF, OFF, OFF, OFF, OFF, ON}, // с {ON, OFF, OFF, OFF, OFF, OFF, OFF, OFF} // m }; const int timerValues[32] = { 1, 2, 3, 4, 5, 10, /*15,*/ 20, 30, 60, /*120, 180, 240, */ 300, /* 360, 420, 480, 540, */ 600, /* 660, 720, 780, 840,*/ 900, /*960, 1020, 1080, 1140,*/ 1200, 1800, 2400, 3600 }; const char* timerStrings[] = { "01с","02с","03s","04s","05s","10С",/*"15s",*/"20s", "30-х годов","01м",/*"02m","03м","04м",*/"05м",/*"06м","07м", "08м","09м",*/"10m",/*"11м","12","13","14м",*/"15м", /*"16m","17м","18м","19м",*/"20m","30m","40м","60m" }; const int светодиодов[3] = {led1, led2, led3}; int sensorValue = 0; // переменная для хранения значения, поступающие от датчика int index = 0; // индекс массив unsigned long lastTime; // время последнего itteration unsigned long lastLED; int first = 0; void setup() { //Serial.begin(9600); initLeds(); pinMode(focusPin, OUTPUT); pinMode(cameraPin, OUTPUT); } void loop() { // читаем значение с датчика: sensorValue = (int) analogRead(regulatorPin)*16/990; if (index != sensorValue) { индекс = sensorValue; lastTime = millis(); lastLED = millis(); first = 0; //Serial.print(sensorValue); //Serial.print(" - "); //Serial.println(analogRead(regulatorPin)); } if ((millis()-lastLED) <= LedsDelay) { updateLeds(); } else { clearLeds(); } если (((millis()-lastTime) >= timerValues[index]*1000) || ((first == 0) && ((millis()-lastTime) >= 1000))) { //Serial.print("["); //Serial.print(первый); //Serial.print("]"); //Serial.print(millis()); //Serial.print(" - "); //Serial.print(millis()-lastTime); //Serial.print(" = "); //Serial.println(timerValues[index]*1000); first++; takePicture(); lastTime = millis(); } } void takePicture() { // digitalWrite(focusPin, высокий); digitalWrite(cameraPin, высокий); delay(60); // digitalWrite(focusPin, низкий); digitalWrite(cameraPin, низкий); } void initLeds() { pinMode(a, OUTPUT); pinMode(b, OUTPUT); pinMode(c, OUTPUT); pinMode(d, OUTPUT); pinMode(e, OUTPUT); pinMode(f, выходной); pinMode(g, выход); pinMode(h, OUTPUT); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(сд3, OUTPUT); digitalWrite(led1, низкий); digitalWrite(led2, низкий); digitalWrite(сд3, низкий); } void updateLeds() { for (int i=0; i<3; i++) { showLed(я); } } void showLed(int j) { clearLeds(); int pos = returnSymbol(timerStrings[index][j]); for(int i=0; i<8; i++) { if ((j == 2) && (i == 1) && ((millis()-lastTime) >= 1000)) { digitalWrite(i, О); } else { digitalWrite(i, символы[pos][i]); } } setLed(j); delay(showLedDelay); } int returnSymbol (char Symbol) { if (Symbol == 's') { return 10; } else if (символ == 'm') { возвращение 11; } else { return ((int)Symbol)-48; } } void setLed(int i) { for (int j=0; j<3; j++) { if (j==i) { digitalWrite(LED[j], HIGH); } else { digitalWrite(LED[j], LOW); } } } void clearLeds() { digitalWrite(LED[0], LOW); digitalWrite(светодиодов[1], LOW); digitalWrite(светодиодов[2], LOW); }полная схема
потому что это функция PORTB прямо из ассемблера поетому сразу шестнадцатиричное десятичное слово ждет
а теперь сравните с таким стилем
это конечно не очень точное сравнеие по железу
но размер кода соотвествует
//art100 to write 20141006 фотосенсор ФД-263 потенциомерт 10к #include <LiquidCrystal.h> //pins--------------------------------- #define FOTODIOD A0//фд263 220ком 5в обреатно смещен LiquidCrystal lcd(8,9,10,11,12,13);//uno //consts----------------------- int fotovar1=0;// //------------------------------------------------ void setup(){ lcd.begin(16, 2);// columns , rows lcd.clear(); Serial.begin(9600); lcd.setCursor(0,0);lcd.print("art100");// fotosensor");//Power var");//" lcd.setCursor(0,1);lcd.print("fotosensor:");// } //================================================= void loop(){ fotovar1=analogRead(FOTODIOD); lcd.setCursor(12,1); lcd.print(fotovar1); Serial.println(fotovar1); delay(500); lcd.setCursor(12,1); lcd.print(" "); } //=================================================а теперь Какой код продуктивнее?
Вот вам и теория управления отображением.
Дибилы и грамотные.
Любое програмное обеспечение компенсирует аппаратное несовершенсто.
Мой закон. И что-то никто не смог мне оппонировать.
Прислушайтесь к словам sav13
И опыт сын ошибок трудных
Семисегментный индикатор. Теория управления "используйте c max7219"
http://ru.aliexpress.com/item/FreeShipping-5PCS-LOT-MAX7219-Led-Module-8-Digit-7-Segment-Digital-LED-Display-Tube-For-Arduino/1995254787.html
порадуйте нас чем нибудь радостным
Что-то много бУкАв написал. Сам повторно не осилю.
А вот этой штуке с MAX7219 не надо всё время долбанить, чтобы оно обновляло индикатор как той хрени с двумя сдвиговыми регистрами?
Я вот такую хрен заказывал. Там для отображения надо всё время срать последовательностью "позиция - значение", чтобы они как бы все светились.
А у меня какой-то странный семисегментник 4-х циферный... Что бы зажечь на нём сегмент цифры, на ногу с ним нужно посылать 0, а не 1!!! Из -за этого не верно себя ведёт и драйвер для семисегментника... То есть те сегменты которые должны гореть, потушены, а те которые не должны, наоборот горят. То есть на 1 дожны гореть А и B, а горят C,D,E,F,G =( Не понимаю как с этим справиться.
и что вообще нет мыслей почему так может быть?
Это вопрос с подвохом? Вероятно так спаян модуль, что у него инверсное обращение к сегментам.
так даже веселее. выясняется что уже не семисегементный индикатор а модуль с драйвером
Опишу ещё раз.
Есть семисегментный индикатор на 4-ре цифры в едином корпусе. У него есть ноги под 7 сегментов и восьмую точку, а так же ещё 4-ре ноги для включения конкретного индикатора.
Во всех скетчах, да и судя по драйверу, чтобы отобразить цифру 1, нужно зажечь два сегмента A,B в 1(подать напряжение на соответствующие пины).
В моём же случае, чтобы получить цифру 1 необходимо зажечь все остальные пины кроме этих двух. Ну и поскольку я хотел использовать драйвер для этого семисегментника и в нём уже забиты эти комбинации ног, возникает вопрос, как поступить в такой ситуации, возможно ли инверсию подавать на семисегментник или как-то переключить его в другой режим работы? Или может быть можно перепрограммировать драйвер(хотя тут у меня наибольшие сомнения, ведь он сделан хардово, а не софтово.) Без драйвера, в теории я то же могу заставить дисплей работать как надо, но тогда на ардуинке практически не стаётся свободных пинов.
какой драйвер
Это когда приходим в ресторан. Официант дает меню с картинками, где остается только тыкнуть пальцем.
Мы кричим не надо нам картинки и названия. Мне надо вот то что ел на свадьбе моего шурина когда он во второй раз женился.
Официант вам помои еще не принес покушать?
Продолжаем. Ну я же обьясняю:
Что бы зажечь на нём сегмент цифры, на ногу с ним нужно посылать 0, а не 1!!!
Исходя из этого индикатор с общим анодом.
То есть на 1 дожны гореть А и B, а горят C,D,E,F,G
А вот здесь что-то непонятно. Проверьте индикатор, подав на ногу сегментов 0, а на ногу знакоместа 1 через резистор.
Что бы зажечь на нём сегмент цифры, на ногу с ним нужно посылать 0, а не 1!!!
Исходя из этого индикатор с общим анодом.
То есть на 1 дожны гореть А и B, а горят C,D,E,F,G
А вот здесь что-то непонятно. Проверьте индикатор, подав на ногу сегментов 0, а на ногу знакоместа 1 через резистор.
Да, 4-х сегментник, с ообщим анодом. И при подаче на один из 4-х контактов, отвечающих за сегмент, загораются диоды в соответсвующем сегменте. Но проблема в том, что:
То есть на 1 дожны гореть А и B, а горят C,D,E,F,G
Следовательно, если я на 3 из 4-ёх знакомест подаю 0, а на последнее подаю 1, и при этом подаю 1 на А и B, то получется, что горят C,D,E,F,G, это похоже на букву Е, вместо 1. То есть всё наоборот. И что бы показать единичку необходимо зажечь(установить пины в HIGH) C,D,E,F,G, а А и B наоборот в LOW. Разумеется, драйвер семисегментника рассчитывает на другое поведение и не ясно как заставить это работать нормально.
В качестве контроллера arduino uno
То есть, я правильно понял, подаете 0 на знакоместо и 1 скажем на А, а горят все остальные? Подаете напрямую или через контроллер какой-то?
Простой и красивый тутор по сегментам и ардуино
http://www.youtube.com/watch?v=6_AtFoeXDoo&list=TLm_wSuI1NQVk&index=9
Простой и красивый тутор по сегментам и ардуино
http://www.youtube.com/watch?v=6_AtFoeXDoo&list=TLm_wSuI1NQVk&index=9
Во, круто! Я какраз купил пару сдвиговых регистра для того чтобы подключить дисплей 16на2
Судя по этому видео, не важно 0 или 1 подавать.
спасибо!