USB лічильник відвідувань на мікроконтролері AVR ATtiny25

Проєкт являє собою лічильник з відображенням даних на LCD-екранчику та передачею даних через USB-інтерфейс. Я, наприклад, використовував цей пристрій як лічильник відвідувань для вебсайту.

Електронний USB лічильник відвідувань на AVR ATtiny25

У проєкті використовується мікроконтролер AVR ATtiny25, в якості драйвера LCD-дисплея використовується мікросхема MAX7219. Для відображення даних використовується звичайний 7-сегментний індикатор на 8 знаків.
Принципова схема пристрою наведена на малюнку нижче:

Принципова схема USB лічильника

 

Для зв'язку мікроконтролера та мікросхеми MAX7219 використовується всього 3 лінії. Програма для контролера написана на AVR-GCC та основана на коді EasyLogger. Також, Christian Starkjohann розробив відмінний програмний USB-драйвер, який називається AVR-USB, за допомогою якого реалізується підтримка USB 1.1 (low speed) для атмеловських AVR мікроконтролерів. Таким чином, необхідність у спеціальній USB-мікросхемі (наприклад, FT232) відпадає, все реалізується програмно. Для живлення м/с MAX7219 потрібен джерело живлення потужністю не менше 300мА та напругою 9-12В. Мікроконтролер IC3 живиться від USB-шини.

Проєкт на макетній платі

Для економії пам'яті мікроконтролера (2к в ATtiny25) MAX7219 використовувався режим decode-mode (див. даташит). У цьому режимі в пам'яті МК не потрібно зберігати таблицю шрифтів для семисегментного індикатора.
Код функції usbFunctionSetup для прийому даних від МК:

USB_PUBLIC uchar usbFunctionSetup(uchar data[8])
{
 static uchar replyBuf[2];
 uchar Dlen;
 usbMsgPtr = replyBuf;
 switch (data[1]) {
   case 0: // data format => data[3]:data[2]:data[5]:data[4]
   MAX7219_DisplayChar(1,data[3] >> 4 & 0x0F); // display digit 0
   MAX7219_DisplayChar(2,data[3] & 0x0F); // display digit 1
   MAX7219_DisplayChar(3,data[2] >> 4 & 0x0F); // display digit 2
   MAX7219_DisplayChar(4,data[2] & 0x0F); // display digit 3
   MAX7219_DisplayChar(5,data[5] >> 4 & 0x0F); // display digit 4
   MAX7219_DisplayChar(6,data[5] & 0x0F); // display digit 5
   MAX7219_DisplayChar(7,data[4] >> 4 & 0x0F); // display digit 6
   MAX7219_DisplayChar(8,data[4] & 0x0F); // display digit 7
   Dlen = 0;
   break;
   case 1:
   MAX7219_Clear();
   Dlen=0;
   break;
   case 2:
   MAX7219_Init();
   Dlen=0;
   break;
   default:
   Dlen=0;
   break;
 }
 return Dlen;
}

Програма на ПК

Програма для комп'ютера написана на Delphi 6 з використанням компонента Indy 10. Для даної версії потрібна спеціальна бібліотека LibUSB-Win32, яка є портованою версією libusb для Windows-систем. Бібліотека значно спрощує користувацькому застосунку доступ до USB-пристрою. Також для Delphi використано компоненти CoolTrayIcon та TextTrayIcon. Компоненти дозволяють згортати застосунок в трей, як це показано на малюнку нижче.

Дане застосування кожні 10 секунд зчитує дані з текстового файлу hits.txt (лічильник відвідувань) і потім перенаправляє дані на USB.

Програма на ПК

Скрипт на вебсервері

На вебсервері використовується файл hits.txt, в який записується кількість відвідувань сторінки. Файл повинен бути доступний для запису (права 0777). Для запису кількості відвідувань використовується простий PHP-скрипт:

 $hitfile = $_SERVER['DOCUMENT_ROOT'].'/counter/hits.txt';
 $hits = @ file_get_contents($hitfile);
 file_put_contents($hitfile,$hits+1,LOCK_EX);
 echo ($hits+1); 	// використовується для налагодження

Для прошивки контролера я використовував AVR ISP програматор та програму PonyProg

Оригінал статті

Прикреплені файли:
Top