8-и разрядный 7-сегментный индикатор - нужна помощь
- Войдите на сайт для отправки комментариев
Здравствуйте, уважаемые!
Пришла мне сегодня вот такая железяка: MAX7219 Red Module 8-Digit 7 Segment Digital LED Display Tube For Arduino MCU. Попытался подключить - получается не очень.
Подключаю модуль к ардуинке используя вот эту инструкцию. Из библиотеки LedControl взял пример LCDemo7Segment - всё работает. Точнее, в первом экранчике всё работает - циферки бегают по первым 4 символам не переходя на второй экранчик.
Поковырялся с кодом, понял, как выводить на вторую часть символы. Захотелось мне большего. Для пробы решил подключить ещё и DHT11 (датчик температуры и влажности который), чтобы на одну половину экрана выводить температуру, а на вторую - влажность. И вот тут затык полный. У меня получается выводить только одинарные символы. А как заставить экран выводить число 10, например, правильно - в два экранных символа? Даже так: может кто ткнёт носом в готовый пример, где температура (+/- двузначное число) и влажность (двузначное число) выводятся на 7-сегментный экранчик?
Примеры, которые я нашёл в сети в большинстве своём расписаны для экранов, подключающихся к ардуинке напрямую, что мне вроде как не очень подходит.
У меня получилось только вот так:
//We always have to include the library #include "LedControl.h" #include "DHT.h" #define DHTPIN 2 // what pin we're connected to #define DHTTYPE DHT11 // DHT 11 /* Now we need a LedControl to work with. ***** These pin numbers will probably not work with your hardware ***** pin 12 is connected to the DataIn pin 11 is connected to the CLK pin 10 is connected to LOAD We have only a single MAX72XX. */ LedControl lc=LedControl(12,11,10,1); /* we always wait a bit between updates of the display */ unsigned long delaytime=250; DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); Serial.println("DHTxx test!"); dht.begin(); /* The MAX72XX is in power-saving mode on startup, we have to do a wakeup call */ lc.shutdown(0,false); /* Set the brightness to a medium values */ lc.setIntensity(0,8); /* and clear the display */ lc.clearDisplay(0); } /* This method will display the characters for the word "Arduino" one after the other on digit 0. */ void writeArduinoOn7Segment() { lc.setChar(0,0,'a',false); delay(delaytime); lc.setRow(0,0,0x05); delay(delaytime); lc.setChar(0,0,'d',false); delay(delaytime); lc.setRow(0,0,0x1c); delay(delaytime); lc.setRow(0,0,B00010000); delay(delaytime); lc.setRow(0,0,0x15); delay(delaytime); lc.setRow(0,0,0x1D); delay(delaytime); lc.clearDisplay(0); delay(delaytime); } /* This method will scroll all the hexa-decimal numbers and letters on the display. You will need at least four 7-Segment digits. otherwise it won't really look that good. */ void scrollDigits() { for(int i=0;i<13;i++) { lc.setDigit(0,3,i,false); lc.setDigit(0,2,i+1,false); lc.setDigit(0,1,i+2,false); lc.setDigit(0,0,i+3,false); delay(delaytime); } lc.clearDisplay(0); delay(delaytime); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(t) || isnan(h)) { Serial.println("Failed to read from DHT"); } else { Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C"); } double t1 = floor(t/10); double t2 = (t - t1*10); if (t < 0) { lc.setChar(0,6,'-',false); } lc.setChar(0,5,t1,false); lc.setChar(0,4,t2,false); double h1 = floor(h/10); double h2 = (h - h1*10); lc.setChar(0,1,h1,false); lc.setChar(0,0,h2,false); // lc.setDigit(0,5,1,false); // writeArduinoOn7Segment(); // scrollDigits(); }
Но ведь это же изврат, верно?
Ай, простите! Забыл автоматом свернуть код :(
Эксперементировал несколько месяцев назад с индикатором. могу подогнать код собственного написания, хотя он очень ламерский, посмотри, может чего полезного почерпнешь
Большое спасибо! Особенно за подробное комментрирование кода. Буду изучать.
вот статьи мне очень помогли, про микросхему max7219
http://radiohlam.ru/raznoe/max7219_7221.htm
http://mcucpu.ru/index.php/pdevices/41-indicators/85-workmax7219
Вот код для max7219 с 8 регистрами. Выводит в первый блок температуру, во второй влажность. С отрицательными температурами работает. Единственное, можно код слегка оптимизировать.
Поковырялся с кодом, понял, как выводить на вторую часть символы. Захотелось мне большего. Для пробы решил подключить ещё и DHT11 (датчик температуры и влажности который), чтобы на одну половину экрана выводить температуру, а на вторую - влажность. И вот тут затык полный. У меня получается выводить только одинарные символы. А как заставить экран выводить число 10, например, правильно - в два экранных символа? Даже так: может кто ткнёт носом в готовый пример, где температура (+/- двузначное число) и влажность (двузначное число) выводятся на 7-сегментный экранчик?
посмотри этот пример, там же ссылки на источник (просто скопируй и посмотри чего получается):
по поводу отображения разных цифр в разных сегмента (посмотри по аналогии):
суть в том, чтобы получить десятые и сотые - необходимо умножить в вычислениях на 10 или 100 и поставить точку в нужном разряде ( при работе с действительными числами процессор "забывает" про все симвалы после запятой ).
кроме того:
v=(sensorValue) /1000%10; // тысячи
x=(sensorValue) /100%10; // сотни
c=(sensorValue) /10%10; // десятки
v=(sensorValue) %10; // един
попробуйте сами догадаться что здесь написано и куда вам это подставить
valter61, Гриша - спасибо большое. Чуть освобожусь и обязательно попробую всё то, что вы подсказали!
Имеются в наличии два шильда индикатора как по ссылке в первом посте этой темы.
При подключении один работает нормально а другой начинает светиться всеми индикаторами и не тухнет.
В чём может быть причина?
Благодарен за отзыв.
Доброго времени суток. Я правильно понимаю что для передачи на индикатор результат измерения надо разложить на число тысяч, число сотен, число десятков и единиц а потом это последовательно передать? Т.е необходимо двоично-десятичное преобразование.
Никто не заставляет выводить на индикатор именно десятичное число. Можно использовать 16-ричное или текст.
Имеются в наличии два шильда индикатора как по ссылке в первом посте этой темы.
При подключении один работает нормально а другой начинает светиться всеми индикаторами и не тухнет.
В чём может быть причина?
Благодарен за отзыв.
Диод закороти на плате, ей питания не хватает
Только теперь придется следить чтобы не перепутать питание
Доброго времени суток. Я правильно понимаю что для передачи на индикатор результат измерения надо разложить на число тысяч, число сотен, число десятков и единиц а потом это последовательно передать? Т.е необходимо двоично-десятичное преобразование.
Библиотека LedControl, лежит на ГитХабе. С ее помощью можно извращаться как угодно с этим индикатором, вт. ч и выводить какие угодно числа и знаки на него. И с запятой тоже вроде как можно
Хотя нет, заблуждаюсь. Нельзя. Надо делить по разрядам :(
Благодарю. Я не силен в программировании, но пришел к выводу что надо делить по разрядам и передавать. Теперь ясно в каком направлении двигаться.
Вот тут делят на разряды, причем успешно: http://arduino.ru/forum/programmirovanie/razdelenie-chisla-na-otdelnye-tsifry
Сделайте функцию и применяйте когда надо :)
Благодарю!