FM радио на TEA5767, LCD Nokia 5110 и Enkoder

FM радио на модуле TEA5767, с выводом информации на графический дисплей от телефона Nokia 5110 (LCD4884 LCD Joystick Shield) и управлением с помощью энкодера. Работу проекта можно посмотреть на видео.

В проекте использованы:

 

Печатная плата в формате .lay

FM_tea5756

Код проекта:


#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;

}