Components and supplies
rtc ds1302 module
PAM8403 + Volume Control
SSD1306 OLED Display
Arduino Nano
RDA5807M FM Radio Module
Breadboard and hook up wire
Apps and platforms
Arduino IDE
Project description
Code
Clock Radio Final
arduino
1#include <Adafruit_SSD1306.h> 2#include <Wire.h> 3#include <RDA5807M.h> 4#include <Arduino.h> 5#include <Ds1302.h> 6#include <LowPower.h> 7#include <SPI.h> 8#define OLED_RESET -1 9#define FIX_BAND RADIO_BAND_FM 10#define SCREEN_WIDTH 128 // OLED display width, in pixels 11#define SCREEN_HEIGHT 32 // OLED display heightint setButton = 9; 12Ds1302 rtc(8,6,7); // RST , CLK , DAT 13 14int dsplyButton = 11; 15int setButton = 9; 16int backButton = 10; 17int potPin = A0; 18 19 20float displayStation; 21int stationNum, val; 22 23Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); 24RDA5807M radio; 25 26// Select Your own radio frequencies for your area 27int stations[10] = {9110,9370,9580,9670,9740,9890,10040,10540,10590,10760}; 28const static char* WeekDays[] = 29{ 30 "Monday ", 31 "Tuesday ", 32 "Wednesday ", 33 "Thursday ", 34 "Friday ", 35 "Saturday ", 36 "Sunday " 37}; 38const static char* MonthText[] = 39{ 40 "Jan", 41 "Feb", 42 "Mar", 43 "Apr", 44 "May", 45 "Jun", 46 "Jul", 47 "Aug", 48 "Sep", 49 "Oct", 50 "Nov", 51 "Dec" 52}; 53 54void setup() { 55 56 rtc.init(); 57 pinMode(dsplyButton,INPUT_PULLUP); 58 pinMode(setButton,INPUT_PULLUP); 59 pinMode(backButton, INPUT_PULLUP); 60 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); 61 display.display(); 62 delay(2000); 63 display.clearDisplay(); 64 65 radio.init(); 66 radio.setBandFrequency(FIX_BAND, 9110); 67 radio.setVolume(8); 68 radio.setMono(false); 69 radio.setMute(false); 70 display.setTextSize(3); 71 display.setTextColor(WHITE); 72 display.setCursor(20,10); 73 display.print("91.10"); 74 display.display(); 75} 76 77void loop() { 78 radio.setVolume(8); 79 Ds1302::DateTime now; 80 rtc.getDateTime(&now); 81 static uint8_t last_second = 0; 82 83 84 if (last_second != now.second) 85 { 86 last_second = now.second; 87 display.setTextColor(SSD1306_WHITE); 88 display.setTextSize(1); 89 display.setCursor(40,0); 90 if (now.hour <= 9) { //If Hour is single figures, put a 0 in front 91 display.print("0"); 92 } 93 display.print(now.hour); 94 display.print(":"); 95 if (now.minute <= 9) { //If Minute is single figures, put a 0 in front 96 display.print("0"); 97 } 98 display.print(now.minute); 99 display.print(":"); 100 if (now.second <= 9) { //If Seconds is single figures, put a 0 in front 101 display.print("0"); 102 } 103 display.print(now.second); 104 105 display.display(); 106 107 display.setTextColor(SSD1306_BLACK); 108 display.setCursor(40,0); 109 if (now.hour <= 9) { 110 display.print("0"); 111 } 112 display.print(now.hour); 113 display.print(":"); 114 if (now.minute <= 9) { 115 display.print("0"); 116 } 117 display.print(now.minute); 118 display.print(":"); 119 if (now.second <= 9) { 120 display.print("0"); 121 } 122 display.print(now.second); 123 } 124 125 if (digitalRead(backButton)== LOW) { 126 127 setFrequency(); 128} 129if (digitalRead(dsplyButton) == LOW) { 130 131 while (digitalRead(dsplyButton) == LOW) { 132 133 } 134 135 radio.term(); 136 DplyClock(); 137 138} 139 140 141 142} 143void setFrequency(){ 144 display.setTextColor(SSD1306_WHITE); 145 146// radio.setMute(false); 147 while(digitalRead(setButton) == HIGH){ 148 display.setTextSize(1); 149 display.setTextColor(WHITE); 150 display.setCursor(0,0); 151 display.print("Select Station"); 152 display.setTextSize(3); 153 display.setTextColor(WHITE); 154 display.setCursor(20,10); 155 val = analogRead(potPin); 156 stationNum = map(val, 0, 1023, 0, 9); 157 displayStation = stations[stationNum]/100.0; 158 display.print(displayStation); 159 display.display(); 160 display.clearDisplay(); 161 } 162 delay(500); 163 radio.setBandFrequency(FIX_BAND, stations[stationNum]); 164 display.setCursor(20,10); 165 display.print(displayStation); 166 display.display(); 167} 168 169 170void DplyClock() { 171 172 173 display.clearDisplay(); 174 while (digitalRead(dsplyButton) == HIGH) { 175 176 // get the current time 177 Ds1302::DateTime now; 178 rtc.getDateTime(&now); 179 static uint8_t last_second = 0; 180 if (last_second != now.second) 181 { 182 last_second = now.second; 183 display.setTextColor(SSD1306_WHITE); 184 display.setTextSize(2); 185 display.setCursor(15,2); 186 if (now.hour <= 9) { //If Hour is single figures, put a 0 in front 187 display.print("0"); 188 } 189 display.print(now.hour); 190 display.print(":"); 191 if (now.minute <= 9) { //If Minute is single figures, put a 0 in front 192 display.print("0"); 193 } 194 display.print(now.minute); 195 display.print(":"); 196 if (now.second <= 9) { //If Seconds is single figures, put a 0 in front 197 display.print("0"); 198 } 199 display.print(now.second); 200 201 display.setTextSize(1); 202 display.setCursor(17,22); 203 display.print(WeekDays[now.dow -1]); 204 display.print(now.day); 205 display.print(" "); 206 display.print(MonthText[now.month -1]); 207 208 display.display(); 209 210 211 display.setTextColor(SSD1306_BLACK); 212 display.setCursor(17,22); 213 display.print(WeekDays[now.dow -1]); 214 display.print(now.day); 215 display.print(" "); 216 display.print(MonthText[now.month -1]); 217 218 219 220 display.setTextSize(2); 221 display.setCursor(15,2); 222 if (now.hour <= 9) { 223 display.print("0"); 224 } 225 display.print(now.hour); 226 display.print(":"); 227 if (now.minute <= 9) { 228 display.print("0"); 229 } 230 display.print(now.minute); 231 display.print(":"); 232 if (now.second <= 9) { 233 display.print("0"); 234 } 235 display.print(now.second); 236 237} 238 LowPower.powerDown(SLEEP_250MS,ADC_OFF,BOD_OFF); // Sleep for 250MS/Sec in Low Power 239} 240while (digitalRead(dsplyButton) == LOW){ 241 } 242 display.setTextColor(SSD1306_WHITE); 243 radio.init(); 244 radio.setBandFrequency(FIX_BAND, stations[stationNum]); 245 display.clearDisplay(); 246 display.setTextSize(3); 247 display.setCursor(20,10); 248 stationNum = map(val, 0, 1023, 0, 9); 249 displayStation = stations[stationNum]/100.0; 250 display.print(displayStation); 251 display.display(); 252} 253
Downloadable files
Vero Schematic
Veroboard design. Make sure the data tracks are short to prevent cross track capacitance interference.
Vero Schematic
Clock Radio Wiring Diagram
Clock Radio Wiring Diagram
Clock Radio Wiring Diagram
Clock Radio Wiring Diagram
Vero Schematic
Veroboard design. Make sure the data tracks are short to prevent cross track capacitance interference.
Vero Schematic
Documentation
Radio Fascia
3D Printer STL
Radio Fascia
Radio Housing
3D Printer STL
Radio Housing
Radio Fascia
3D Printer STL
Radio Fascia
Radio Housing
3D Printer STL
Radio Housing
Comments
Only logged in users can leave comments