FM радио на модуле TEA5767, с выводом информации на графический дисплей от телефона Nokia 5110 (LCD4884 LCD Joystick Shield) и управлением с помощью энкодера. Работу проекта можно посмотреть на видео.
В проекте использованы:
Печатная плата в формате .lay
Код проекта:
#include <LCD5110_Graph.h> // http://www.rinkydinkelectronics.com/library.php?id=48 #include <Wire.h> int encoder0PinA = 8; // вход энкодера int encoder0PinB = 9; int encoder0Pos = 0; int encoder0PinALast = LOW; int n = LOW; LCD5110 myGLCD(2,3,4,6,5); extern uint8_t SmallFont[]; extern uint8_t MediumNumbers[]; extern uint8_t BigNumbers[]; unsigned char frequencyH=0; unsigned char frequencyL=0; float f = 100.5; // частота при включении // функция пишит частоту в модуль void setFrequency(float frequency){ unsigned int frequencyB = 4 * (frequency * 1000000 + 225000) / 32768; byte frequencyH = frequencyB >> 8; byte frequencyL = frequencyB & 0XFF; Wire.beginTransmission(0x60); Wire.write(frequencyH); Wire.write(frequencyL); Wire.write(0xB0); Wire.write(0x10); Wire.write(0x00); Wire.endTransmission(); } //// для кнопок ЛСДшилда byte key(){ int val = analogRead(0); if (val < 50) return 2; else if (val < 200) return 3; else if (val < 400) return 4; else if (val < 600) return 5; else if (val < 800) return 1; else return 0; } // вывод всего на LCD void LCDsend(){ int csr = map(f*10, 880, 1080, 0, 840) / 10; myGLCD.clrScr(); myGLCD.setFont(BigNumbers); myGLCD.printNumF(f, 1, CENTER, 0); myGLCD.setFont(SmallFont); myGLCD.print("mHz", CENTER, 32); myGLCD.print("FM", LEFT, 0); myGLCD.print("87", LEFT, 35); myGLCD.print("108", RIGHT, 35); // if (st) myGLCD.print("ST", LEFT, 10); myGLCD.drawLine(0, 47, 83, 47); // шкала myGLCD.drawLine(0, 43, 83, 43); myGLCD.drawLine(0, 43, 0, 47); myGLCD.drawLine(83, 43, 83, 48); for (int i = 3; i < 84; i += 7) myGLCD.setPixel(i, 45); myGLCD.drawLine(csr, 43, csr, 47); // полоска на шкале myGLCD.drawLine(csr+1, 43, csr+1, 47); myGLCD.drawLine(csr-1, 43, csr-1, 47); myGLCD.update(); } void setup(){ myGLCD.InitLCD(60); Wire.begin(); pinMode (encoder0PinA,INPUT_PULLUP); pinMode (encoder0PinB,INPUT_PULLUP); setFrequency(f); LCDsend(); } void loop(){ /* // управление кнопками шилда if (key() == 2){ f -= .1; setFrequency(f); LCDsend(); } if (key() == 5){ f += .1; setFrequency(f); LCDsend(); } delay(100); */ // управление энкодером n = digitalRead(encoder0PinA); if ((encoder0PinALast == LOW) && (n == HIGH)) { if (digitalRead(encoder0PinB) == LOW) { f -= .1; } else { f += .1; } setFrequency(f); LCDsend(); } encoder0PinALast = n; // защита от выхода за диапазон FM if (f < 87.4) f = 87.4; else if (f > 108.0) f = 108.0; }