Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Construye una radio FM a prueba de agua para la ducha con Arduino Nano, RDA5807, LCD Nokia y PAM8403

Componentes y materiales

Componente Cantidad
Arduino Nano R3 1
Módulo FM RDA5807 (RDA Microelectronics) 1
Pantalla LCD Nokia 5110 (versión 3V-5V) 1
Módulo RTC Tiny (DS1307 + EEPROM 24C32) 1
Amplificador PAM8403 (2×3W clase D) 1
Convertidor DC-DC LM2596 Step-Down 1
Batería recargable LIR2032 3.6V 1
Resistencia 100 Ω 1
Resistencia 1 kΩ 1
Resistencia 10 kΩ 6
Resistencia 100 kΩ 1
MOSFET de potencia IRLZ44 (Infineon) 1
Altavoces PEIYING PY1010C 60W 4Ω 1
Fuente 12V 3A (recuperada) 1
Condensadores 2200 µF 25V 2
Condensador 100 µF 1
Bombillas LED 3W (sustituyen halógenos G4 10W) 1

Sobre el proyecto

Hace unos años compré una cabina de ducha china con sistema de control TR028 que incluía radio. Un día dejó de funcionar completamente y nadie pudo repararlo. Compré otra radio de ducha más barata; murió al año. Mi familia estaba acostumbrada a tener radio en la ducha, así que investigué cómo funcionaban estos dispositivos. Dentro del TR028 encontré un módulo TEA5767; buscando descubrí el RDA5807, muy similar pero con RDS, control de volumen y bass boost. Decidí usar el RDA5807.

Mi visión

En AliExpress compré RDA5807, Tiny RTC con EEPROM 32KB, PAM8403, LCD Nokia 5110, módulos LM2596 por menos de 10€ y empecé a experimentar.

Qué conseguí finalmente

Funcionamiento

Qué cambiaría

Conclusión

Estoy contento con el resultado. Tras 1 mes funcionando sin problemas salvo la precisión del reloj. No soy programador, el código se puede optimizar. Mi experiencia en C/C++ es de ~1 año, autodidacta. Es mi primer proyecto útil con Arduino y el primero que comparto. Disculpad posibles errores y mi mal inglés. Preguntas en comentarios o PM.

Actualización 1: Fuse 2A en línea de 12V (seguridad). Software: línea 586 menu = 1; restaura modo VOLUMEN al pulsar encendido.

Actualización 2: El LCD está fallando. Busco alternativa barata al Nokia 5110; no pondré otro 5110 (pequeño y difícil de leer). Probaré TFT 1.8" (más grande, brillante, mejor resolución) aunque consumirá más recursos. Acepto sugerencias.

Código

Sketch principal (Arduino)

/////////////////////////////////////////////////////////////////
// Arduino based shower FM Radio Project
// Arduino NANO, RDA5807M, RTC, EEPROM, LCD5110, Thermistor
/////////////////////////////////////////////////////////////////
#include <LCD5110_Graph.h>
#include <AT24CX.h>
#include <Wire.h>
#include <RDSParser.h>
#include <radio.h>
#include <RTClib.h>
#include <RDA5807M.h>
#include <Keypad.h>

#define MAXmenu 4
#define ledPin 13
#define blPin 7

char keys[7][2] = {
  {'L', 'P'}, // LED, POWER
  {'I', 'D'}, // INFO, DISPLAY
  {'1', '2'}, // predefinidas
  {'3', '4'},
  {'5', '6'},
  {'M', 'm'}, // MODE, MEM
  {'<', '>'} // down, up
};

byte rowPins[7] = {11, 12, 10, 17, 9, 16, 8};
byte colPins[2] = {15, 14};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, 7, 2);

boolean bass = 0, dspl = 0, memdisplay = 0, mempress = 0, adj = 0;
boolean ledPin_state, power_state;
int menu, volume, volumeOld = 5, frequency, frequencyOld;
int txtl = 0, temparray = 0;
int samples[5];
unsigned int status[6];
unsigned long timeprevious = 0, timeprev = 0;

AT24CX mem;
RTC_DS1307 rtc;
LCD5110 lcd(6, 5, 4, 2, 3);
RDA5807M radio;
RDSParser rds;

extern unsigned char SmallFont[];
extern uint8_t signal5[]; extern uint8_t signal4[]; extern uint8_t signal3[];
extern uint8_t signal2[]; extern uint8_t signal1[];

void setup() {
  analogReference(EXTERNAL);
  Serial.begin(9600);
  Wire.begin();
  radio.init(); radio.debugEnable();
  lcd.InitLCD(); lcd.clrScr(); lcd.setFont(SmallFont); lcd.enableSleep();
  power_state = 0; // standby al conectar alimentación
  keypad.addStatedEventListener(keypadEvent);
  keypad.setHoldTime(1500);
  pinMode(ledPin, OUTPUT); pinMode(blPin, OUTPUT);
  digitalWrite(ledPin, LOW); digitalWrite(blPin, LOW);
  ledPin_state = digitalRead(ledPin);

  frequency = mem.readInt(201);
  volume = 2; menu = 1;
  if (volume < 0) volume = 0; if (volume > 15) volume = 15;
  if (frequency < 0) frequency = 0; if (frequency > 210) frequency = 210;

  WriteReg(0x02, 0xC00d); // soft reset, enable, RDS
  radio.attachReceiveRDS(RDS_process);
  rds.attachServicenNameCallback(DisplayServiceName);
  rds.attachTextCallback(DisplayText);
}

void loop() {
  if (frequency != frequencyOld) { frequencyOld = frequency; mem.writeInt(201, frequency); canal(frequency); }
  if (volume != volumeOld) { volumeOld = volume; WriteReg(5, 0x84D0 | volume); }

  char key = keypad.getKey();
  radio.checkRDS();

  // Temperatura cada 0.6s, 5 muestras, media
  unsigned long timenow = millis();
  if ((unsigned long)(timenow - timeprevious) > 600) {
    timeprevious = timenow;
    samples[temparray] = analogRead(A7);
    temparray++;
  }
  if (temparray == 5) {
    float average = 0;
    for (int i = 0; i < 5; i++) average += samples[i];
    printTemp(average);
    temparray = 0;
  }

  // Timeout 4s para MEM
  unsigned long dabar = millis();
  if (mempress == 1) { timeprev = dabar; memdisplay = 1; mempress = 0; }
  if (memdisplay == 1) {
    if ((unsigned long)(dabar - timeprev) < 4000) memdisplay = 1; else memdisplay = 0;
  }

  // Ajuste RTC por Serial
  DateTime now = rtc.now();
  if (Serial.available() > 0) {
    char t = Serial.read();
    switch (t) {
      case 'h': { unsigned int hours = Serial.parseInt(); rtc.adjust(DateTime(now.year(), now.month(), now.day(), hours, now.minute(), now.second())); Serial.println(F("Hours")); Serial.println(hours); break; }
      case 'm': { unsigned int mins = Serial.parseInt(); rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), mins, now.second())); Serial.println(F("Minutes")); Serial.println(mins); break; }
      case 's': { unsigned int sec = Serial.parseInt(); rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute(), sec)); Serial.println(F("Seconds")); Serial.println(sec); break; }
    }
  }

  printSignalStrength(); printLines(); printTime(); printFreq(); printStereo(); printMode(); printMenu(); printDate();
  lcd.update();
}

// ... funciones de visualización, PID, RDS, teclado, etc. (ver código original completo)

Símbolos de intensidad de señal (C/C++)

#if defined(__AVR__)
#include <avr/pgmspace.h>
#define imagedatatype const uint8_t
#elif defined(__PIC32MX__)
#define PROGMEM
#define imagedatatype const unsigned char
#elif defined(__arm__)
#define PROGMEM
#define imagedatatype const unsigned char
#endif

imagedatatype signal5[] PROGMEM={ 0xC1,0xC2,0xC4,0xFF,0xC4,0xC2,0xC1,0xC0,0xE0,0xC0,0xF0,0xC0,0xF8,0xC0,0xFC,0xC0,0xFE };
imagedatatype signal4[] PROGMEM={ 0xC1,0xC2,0xC4,0xFF,0xC4,0xC2,0xC1,0xC0,0xE0,0xC0,0xF0,0xC0,0xF8,0xC0,0xFC,0xC0,0xC0 };
imagedatatype signal3[] PROGMEM={ 0xC1,0xC2,0xC4,0xFF,0xC4,0xC2,0xC1,0xC0,0xE0,0xC0,0xF0,0xC0,0xF8,0xC0,0xC0,0xC0,0xC0 };
imagedatatype signal2[] PROGMEM={ 0xC1,0xC2,0xC4,0xFF,0xC4,0xC2,0xC1,0xC0,0xE0,0xC0,0xF0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0 };
imagedatatype signal1[] PROGMEM={ 0xC1,0xC2,0xC4,0xFF,0xC4,0xC2,0xC1,0xC0,0xE0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0 };

Esquemático

Esquema completo del circuito (imagen referenciada).

Proceso de manufactura

  1. La Evolución e Ingeniería de la Tecnología de Radio
  2. Circuitos integrados (CI): chips compactos y potentes que impulsan la electrónica moderna
  3. Generador de Ondas JX – Oscilador DDS Compatible con Arduino con Pantalla OLED
  4. MotionSense: Detección inteligente de intrusos con Arduino y ESP8266
  5. Construye una Caja Puzle IoT Segura con Arduino MKR Bundle – Guía Paso a Paso
  6. Regulador de Ducha Inteligente – Válvula Solenoide para Control Preciso de Temperatura
  7. Escáner de Temperatura IR Inalámbrico – Arduino Nano, Bluetooth y MLX90614
  8. Construye tu Propio Tanque Autónomo: Walabot, Arduino, Raspberry Pi y Alexa
  9. Laboratorio avanzado de microcontroladores: ESP32, Arduino, PIC y módulos de sensores
  10. Kit MOSMusic: Control de Iluminación de Alta Potencia Sincronizada con Música vía MOSFET y Arduino
  11. Pulsera inteligente con Arduino MKR GSM 1400 y Hologram IoT