92 lines
3.0 KiB
Arduino
92 lines
3.0 KiB
Arduino
/***************************************************
|
|
* Radio met analoge afstemming en LCD
|
|
*
|
|
* Radio op basis van de (Philips) TEA5767 met een
|
|
* LCD voor informatie-weergave. Afstemming gaat met
|
|
* een potentiometer wat de afstemming dus analoog
|
|
* maakt.
|
|
*
|
|
* Gebruikte libraries:
|
|
* TEA5767 FM Radio Library for Arduino by Simon Monk
|
|
* New LiquidCrystal by fmalpartida
|
|
***************************************************/
|
|
|
|
#include <Wire.h>
|
|
#include <TEA5767Radio.h>
|
|
#include <LiquidCrystal_I2C.h>
|
|
|
|
// Onderstaand zijn de gegevens van het door mij gebruikte LCD en IIC-module
|
|
#define I2C_ADDR 0x27 // IIC-adres van het LCD
|
|
#define BACKLIGHT_PIN 3
|
|
#define En_pin 2
|
|
#define Rw_pin 1
|
|
#define Rs_pin 0
|
|
#define D4_pin 4
|
|
#define D5_pin 5
|
|
#define D6_pin 6
|
|
#define D7_pin 7
|
|
|
|
// Initialisitie van de FM-module
|
|
TEA5767Radio radio = TEA5767Radio();
|
|
|
|
// Initialisitie van lcd
|
|
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
|
|
|
|
#define freqPot A0 // Analoge pin voor de potmeter ten behoeve van de afstemming
|
|
int freqPotValue; // Waarde van de Potentiometer in 0 tot 1023
|
|
float freq; // Frequentie (uiteindelijke frequentie x 10)
|
|
int previousFreq; // Laatste gekozen frequentie
|
|
|
|
// Veelgebruikte gegevens
|
|
int freqMin = 760; // Laagste frequentiekeuze x10
|
|
int freqMax = 1080; // Hoogste frequentiekeuze x10
|
|
|
|
void setup()
|
|
{
|
|
Wire.begin();
|
|
|
|
lcd.begin(16, 2); // Type LCD (16x2) opgeven.
|
|
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); // Pin achtergrondverlichting LCD zetten.
|
|
lcd.setBacklight(HIGH); // Achtergrondverlichting LCD aanzetten.
|
|
}
|
|
|
|
void loop()
|
|
{
|
|
// Uitlezen potmeter
|
|
freqPotValue = analogRead(freqPot);
|
|
|
|
// Potmeter waarde (0 - 1023) omzetten in een frequentie (76MHz - 108MHz)
|
|
// De frequentiewaarde is x 10 om ook de waarde achter de punt te bepalen.
|
|
// De map-functie kent alleen integere getallen.
|
|
// De potmeter komt nooit helemaal op 0 of 1023. Hierom zijn de eerste en laatste 32 stappen vervallen.
|
|
// berekening: 1080-760 = 320
|
|
// 1024/320 = 3,2 -> 3
|
|
// 320x3 = 960
|
|
// 1024-960 = 64
|
|
// 64/2 = 32
|
|
// Met deze berekening delen steeds 3 potmeterwaarden 1 frequentie. Hierdoor voelt de afstemming ook beter aan
|
|
// en zijn de stappen consequent.
|
|
freq = map(freqPotValue, 31, 991, freqMin, freqMax);
|
|
|
|
//Zorgen dat freq niet onder freqMin of boven freqMax komt.
|
|
if (freq < freqMin) {
|
|
freq = freqMin;
|
|
} else if (freq > freqMax) {
|
|
freq = freqMax;
|
|
}
|
|
|
|
// Frequentie alleen verzenden naar de TEA5767 als er daadwerkelijk een nieuwe is geselecteerd.
|
|
if (previousFreq != freq){
|
|
lcd.setCursor(0, 0); // Cursor LCD op positie 1 van regel 1.
|
|
lcd.print("FM "); // tekst FM weergeven.
|
|
lcd.print(freq/10); // de frequentie in zijn uiteindelijk vorm weergeven.
|
|
|
|
// Frequentie naar de TEA5767 verzenden.
|
|
radio.setFrequency(freq/10);
|
|
}
|
|
|
|
// Kleine pauze toepassen.
|
|
delay(10);
|
|
}
|
|
|