Термометр на китайском LED-дисплее P10 (V701C)

Температурный дисплей, описываемый в этой статье, предназначен для установки вне помещений и измерения значения температуры окружающей среды. Длина шлейфа к датчику может составлять до 20 метров (длиннее не испытывал), что позволяет разнести сам датчик и дисплей. Диапазон измерения: от -40 до +50. Точность измерения согласно даташиту на датчик DS1820 = +/-0.5 C. Ток потребления около 1.3 А.

Светодиодные модули были приобретены в китайском интернет-магазине. Цветовые варианты различны — зелёные, красные, синие и даже лунного свечения. По правде говоря, покупая данные модули ставилась задача изучить протоколы HUB08, HUB12, поскольку информации в сети по ним крайне мало (точнее даже вообще нет).

Итак, модули состоят из матрицы светодиодов(32х16=512 штук) и 16 штук регистров сдвига на 74HC595. Фото смотри ниже…

P10 Module LED Photo

Изучая принцип работы схемы пришёл к такому алгоритму:

Таким образом, всего 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;
	}
}
Запись опубликована в рубрике C++, Программирование, Радиолюбитель с метками , , , , , , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий