Температурный дисплей, описываемый в этой статье, предназначен для установки вне помещений и измерения значения температуры окружающей среды. Длина шлейфа к датчику может составлять до 20 метров (длиннее не испытывал), что позволяет разнести сам датчик и дисплей. Диапазон измерения: от -40 до +50. Точность измерения согласно даташиту на датчик DS1820 = +/-0.5 C. Ток потребления около 1.3 А.
Светодиодные модули были приобретены в китайском интернет-магазине. Цветовые варианты различны — зелёные, красные, синие и даже лунного свечения. По правде говоря, покупая данные модули ставилась задача изучить протоколы HUB08, HUB12, поскольку информации в сети по ним крайне мало (точнее даже вообще нет).
Итак, модули состоят из матрицы светодиодов(32х16=512 штук) и 16 штук регистров сдвига на 74HC595. Фото смотри ниже…
Изучая принцип работы схемы пришёл к такому алгоритму:
Таким образом, всего 4 группы регистров сдвига. Каждая группа включается подачей соответствующих уровней на порты A и B. Индикация динамическая, поэтому пока горит установленная группа — сдвигаются регистры на следующей группе и т.д.
Изначально была идея собрать бегущую строку на данных модулях, однако процессор PIC18F2550 показал, что ОЗУ в 2 кБайта для этого маловато — работу необходимо вести с типом double word. Покупать ради экспериментов что-то серьёзное смысла нет, так как у китайца готовые контроллеры стоят по 20-30$.
Пришёл к идее разработки данного термометра, который часто устанавливают для привлечения внимания на торговых точках(ларьки, аптеки). Схема прибора ниже…
Скачать прошивку для микроконтроллера можно по этому линку tempP10led. Исходники не просите — сделаем жизнь студентов по-сложнее))). А вот идею покажу, но после просмотра видео.
Как показать на экране надпись DEVLAB.BY, которую вы видели в приветствии на экране? Всё просто — нужно сесть и разобраться в приведённом ниже коде…
dword hello[16]={ 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b11100111101000101000001100111100, 0b10010100001000101000010010100010, 0b10010111001000101000010010111100, 0b10010100000101001000011110100010, 0b11100111100010001111010010111100, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000, 0b00000000000111100100010000000000, 0b00000000000100010010100000000000, 0b00000000000111100001000000000000, 0b00000000000100010001000000000000, 0b00000000010111100001000000000000, 0b00000000000000000000000000000000, 0b00000000000000000000000000000000 }; void ServiceReq(void){ // функция вызывается каждые 50 мкс static word led_count=0; byte t[4] = {32,24,16,8}; unsigned char i=0; unsigned char x=0; unsigned char xx=0; if(led_count ==500){ LATBbits.LATB2 =1; //включаем модуль for(xx=0;xx0;x--){ ShowLines(((x-1)*4)+xx,t[i]); // установить регистры группы } } if(xx==0){ LATBbits.LATB0=0;LATBbits.LATB1=0; // первая группа регистров }else if(xx==1){ LATBbits.LATB0=1;LATBbits.LATB1=0; // вторая группа регистров }else if(xx==2){ LATBbits.LATB0=0;LATBbits.LATB1=1; // третья группа регистров }else{ LATBbits.LATB0=1;LATBbits.LATB1=1; // четвёртая группа регистров } LATBbits.LATB6=1;LATBbits.LATB6=0; // сигнал STR } LATBbits.LATB2 =0; //выключаем модуль led_count = 0U; } } void ShowLines(byte y, byte x) { byte a; for(a=x;a>(x-8);a--){ LATBbits.LATB5 = UBit(y,(a-1)); //устанавливаем сигнал R1 LATBbits.LATB7=1;LATBbits.LATB7=0; // сигнал CLK } } BOOL UBit(byte byteB, byte bit0) { if(((hello[byteB] >> bit0) & 1) > 0) { return 0; }else{ return 1; } }