Introduction: DTMF Decoder for Handy With Arduino, Control Over Several Kilometers

About: Hello, my name is Carlos. I have a YouTube channel where I share my projects in https://www.youtube.com/c/carlosvolt

In this tutorial we will see how to make a circuit to connect to our handy, in this case a Baofeng UV-5R (although it also works for other brands and models) 

Supplies

Step 1:

In this tutorial we will see how to make a circuit to connect to our handy, in this case a Baofeng UV-5R (although it also works for other brands and models) for long distance control of motors, lights, water pumps without the need to use a cellular network, or in places where it does not exist. We will see the assembly of the electronic circuit, we will study the source code and finally we will test the entire device to verify its operation.




Electronic components




3.58 Mhz crystal




Two 100K Ohm resistors




Two 100 nF ceramic disc capacitors




A 300K Ohm resistor




An arduino mini pro




Two handy baofeng or similar




hc-05 module (optional)

Only if you want to see the data received on your cell phone you can connect this module, that is why it is optional and not mandatory.

  1. Works as a bluetooth master and slave device
  2. Configurable via AT commands
  3. Bluetooth V2.0+EDR
  4. Operating frequency: 2.4 GHz ISM band
  5. Modulación: GFSK (Gaussian Frequency Shift Keying)
  6. Transmit power: <=4dBm, Class 2
  7. Sensitivity: <=-84dBm @ 0.1% BER
  8. Security: Authentication and encryption
  9. Perfiles Bluetooth: Puerto serie bluetooth.
  10. Distance of up to 10 meters in optimal conditions
  11. Operating Voltage: 3.6 VDC to 6 VDC
  12. Current Consumption: 30 mA to 50 mA
  13. Chip: BC417143
  14. Version or firmware: 3.0-20170609
  15. Default Baud: 38400
  16. Supported baud rates: 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200.
  17. Interface: Serial TTL
  18. Antenna: Integrated into the PCB
  19. Security: Authentication and encryption (Default password: 0000 or 1234)
  20. Working temperature (Max): 75°C
  21. Working temperature (Min): -20°C
  22. Dimensions: 4.4 x 1.6 x 0.7 cm




Female pins




2.5mm male jack plug




Integrated circuit MT8870de

Pinout del MT8870DE

Data sheet

mt8870d-datasheet




Display oled con driver SSD1306

The display performance is better than traditional LCD screen, also lower consumption.

Specification:

Driver IC: SSD1306

Size: 0.91 inch OLED

Resolution: 128 x 32

Size: 38 * 12mm

Number of pins: 4 pins

Interface type:

IIC interface

Screen color: White / Blue

Pin description:

GND: Power Ground

VCC: Power + (DC 3.3 ~ 5v)

Working temperature: -40 ~ 85 ℃

SCL: Clock line

SDA: Data line

OLED display, no need backlight, self-illumination, Screen color: blue.

The display performance is better than traditional LCD, also lower consumption; IIC (I2C communications) simplifies connections.

Use with Arduino, ESP8266, ESP32, STM32, etc. 3.3 to 5v voltage




Pines macho




Socket for the arduino mini pro




Socket for the MT8870 integrated circuit




Circuit




PCB

Download pcb –> dtmf duino


C


Step 2: Source Code

#include <Arduino.h>
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
U8G2_SSD1306_128X32_UNIVISION_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); //Display SSD1306 de 128x32

int codigo;
const int Pin12 = 12;
const int Pin11 = 11;
const int Pin10 = 10;
const int Pin9 = 9;
const int Pin8 = 8;
const int Pin7 = 7;
const int Pin6 = 6;
const int Pin5 = 5;
const int Pin4 = 4;
const int Pin3 = 3;
const int Pin2 = 2;

int EstadoPin2 = 0;
int EstadoPin3 = 0;
int EstadoPin4 = 0;
int EstadoPin5 = 0;
int EstadoPin6 = 0;

void setup() {
Serial.begin(9600);//Velocidad del puerto serial
u8g2.begin();//Inicializamos el display
// Ponemos los pines 2 al 6 como entradas para el circuto integrado MT8870DE
pinMode(Pin2, INPUT);
pinMode(Pin3, INPUT);
pinMode(Pin4, INPUT);
pinMode(Pin5, INPUT);
pinMode(Pin6, INPUT);
//Salidas control de luces, motores, relay, triac, etc
pinMode(Pin7, OUTPUT);
pinMode(Pin8, OUTPUT);
pinMode(Pin9, OUTPUT);
pinMode(Pin10, OUTPUT);
pinMode(Pin11, OUTPUT);
pinMode(Pin12, OUTPUT);
//Inicializamos el display con la leyenda "Preparado"
codigo = 17;
displayOled();
}

void loop() {

// Leemos el estado de los pines 2 al 6
EstadoPin2 = digitalRead(Pin2);
EstadoPin3 = digitalRead(Pin3);
EstadoPin4 = digitalRead(Pin4);
EstadoPin5 = digitalRead(Pin5);
EstadoPin6 = digitalRead(Pin6);
delay(110);
//Boton 1 10001
if (EstadoPin6 == HIGH && EstadoPin5 == LOW && EstadoPin4 == LOW && EstadoPin3 == LOW && EstadoPin2 == HIGH ) {

Serial.print("1");
while(EstadoPin6 == HIGH && EstadoPin5 == LOW && EstadoPin4 == LOW && EstadoPin3 == LOW && EstadoPin2 == HIGH){
EstadoPin2 = digitalRead(Pin2);
EstadoPin3 = digitalRead(Pin3);
EstadoPin4 = digitalRead(Pin4);
EstadoPin5 = digitalRead(Pin5);
EstadoPin6 = digitalRead(Pin6);
codigo = 1;
digitalWrite(Pin7, HIGH);
displayOled();
}
}
//Boton 2 01001
if (EstadoPin6 == LOW && EstadoPin5 == HIGH && EstadoPin4 == LOW && EstadoPin3 == LOW && EstadoPin2 == HIGH ) {

Serial.print("2");
while(EstadoPin6 == LOW && EstadoPin5 == HIGH && EstadoPin4 == LOW && EstadoPin3 == LOW && EstadoPin2 == HIGH ){
EstadoPin2 = digitalRead(Pin2);
EstadoPin3 = digitalRead(Pin3);
EstadoPin4 = digitalRead(Pin4);
EstadoPin5 = digitalRead(Pin5);
EstadoPin6 = digitalRead(Pin6);
digitalWrite(Pin7, LOW);
codigo = 2;
displayOled();
}
}
//Boton 3 11001
if (EstadoPin6 == HIGH && EstadoPin5 == HIGH && EstadoPin4 == LOW && EstadoPin3 == LOW && EstadoPin2 == HIGH ) {

Serial.print("3");
while(EstadoPin6 == HIGH && EstadoPin5 == HIGH && EstadoPin4 == LOW && EstadoPin3 == LOW && EstadoPin2 == HIGH ){
EstadoPin2 = digitalRead(Pin2);
EstadoPin3 = digitalRead(Pin3);
EstadoPin4 = digitalRead(Pin4);
EstadoPin5 = digitalRead(Pin5);
EstadoPin6 = digitalRead(Pin6);
digitalWrite(Pin8, HIGH);
codigo = 3;
displayOled();
}
}
//Boton 4 00101
if (EstadoPin6 == LOW && EstadoPin5 == LOW && EstadoPin4 == HIGH && EstadoPin3 == LOW && EstadoPin2 == HIGH ) {

Serial.print("4");
while(EstadoPin6 == LOW && EstadoPin5 == LOW && EstadoPin4 == HIGH && EstadoPin3 == LOW && EstadoPin2 == HIGH ){
EstadoPin2 = digitalRead(Pin2);
EstadoPin3 = digitalRead(Pin3);
EstadoPin4 = digitalRead(Pin4);
EstadoPin5 = digitalRead(Pin5);
EstadoPin6 = digitalRead(Pin6);
digitalWrite(Pin8, LOW);
codigo = 4;
displayOled();
}
}
//Boton 5 10101
if (EstadoPin6 == HIGH && EstadoPin5 == LOW && EstadoPin4 == HIGH && EstadoPin3 == LOW && EstadoPin2 == HIGH ) {

Serial.print("5");
while(EstadoPin6 == HIGH && EstadoPin5 == LOW && EstadoPin4 == HIGH && EstadoPin3 == LOW && EstadoPin2 == HIGH ){
EstadoPin2 = digitalRead(Pin2);
EstadoPin3 = digitalRead(Pin3);
EstadoPin4 = digitalRead(Pin4);
EstadoPin5 = digitalRead(Pin5);
EstadoPin6 = digitalRead(Pin6);
digitalWrite(Pin9, HIGH);
codigo = 5;
displayOled();
}
}
//Boton 6 01101
if (EstadoPin6 == LOW && EstadoPin5 == HIGH && EstadoPin4 == HIGH && EstadoPin3 == LOW && EstadoPin2 == HIGH ) {

Serial.print("6");
while(EstadoPin6 == LOW && EstadoPin5 == HIGH && EstadoPin4 == HIGH && EstadoPin3 == LOW && EstadoPin2 == HIGH ){
EstadoPin2 = digitalRead(Pin2);
EstadoPin3 = digitalRead(Pin3);
EstadoPin4 = digitalRead(Pin4);
EstadoPin5 = digitalRead(Pin5);
EstadoPin6 = digitalRead(Pin6);
digitalWrite(Pin9, LOW);
codigo = 6;
displayOled();
}
}
//Boton 7 11101
if (EstadoPin6 == HIGH && EstadoPin5 == HIGH && EstadoPin4 == HIGH && EstadoPin3 == LOW && EstadoPin2 == HIGH ) {

Serial.print("7");
while(EstadoPin6 == HIGH && EstadoPin5 == HIGH && EstadoPin4 == HIGH && EstadoPin3 == LOW && EstadoPin2 == HIGH ){
EstadoPin2 = digitalRead(Pin2);
EstadoPin3 = digitalRead(Pin3);
EstadoPin4 = digitalRead(Pin4);
EstadoPin5 = digitalRead(Pin5);
EstadoPin6 = digitalRead(Pin6);
digitalWrite(Pin10, HIGH);
codigo = 7;
displayOled();
}
}
//Boton 8 00011
if (EstadoPin6 == LOW && EstadoPin5 == LOW && EstadoPin4 == LOW && EstadoPin3 == HIGH && EstadoPin2 == HIGH ) {

Serial.print("8");
while(EstadoPin6 == LOW && EstadoPin5 == LOW && EstadoPin4 == LOW && EstadoPin3 == HIGH && EstadoPin2 == HIGH ){
EstadoPin2 = digitalRead(Pin2);
EstadoPin3 = digitalRead(Pin3);
EstadoPin4 = digitalRead(Pin4);
EstadoPin5 = digitalRead(Pin5);
EstadoPin6 = digitalRead(Pin6);
digitalWrite(Pin10, LOW);
codigo = 8;
displayOled();
}
}
//Boton 9 10011
if (EstadoPin6 == HIGH && EstadoPin5 == LOW && EstadoPin4 == LOW && EstadoPin3 == HIGH && EstadoPin2 == HIGH ) {

Serial.print("9");
while(EstadoPin6 == HIGH && EstadoPin5 == LOW && EstadoPin4 == LOW && EstadoPin3 == HIGH && EstadoPin2 == HIGH ){
EstadoPin2 = digitalRead(Pin2);
EstadoPin3 = digitalRead(Pin3);
EstadoPin4 = digitalRead(Pin4);
EstadoPin5 = digitalRead(Pin5);
EstadoPin6 = digitalRead(Pin6);
digitalWrite(Pin11, HIGH);
codigo = 9;
displayOled();
}
}
//Boton 0 01011
if (EstadoPin6 == LOW && EstadoPin5 == HIGH && EstadoPin4 == LOW && EstadoPin3 == HIGH && EstadoPin2 == HIGH ) {

Serial.print("0");
while(EstadoPin6 == LOW && EstadoPin5 == HIGH && EstadoPin4 == LOW && EstadoPin3 == HIGH && EstadoPin2 == HIGH ){
EstadoPin2 = digitalRead(Pin2);
EstadoPin3 = digitalRead(Pin3);
EstadoPin4 = digitalRead(Pin4);
EstadoPin5 = digitalRead(Pin5);
EstadoPin6 = digitalRead(Pin6);
digitalWrite(Pin11, LOW);
codigo = 0;
displayOled();
}
}
//Boton * 11011
if (EstadoPin6 == HIGH && EstadoPin5 == HIGH && EstadoPin4 == LOW && EstadoPin3 == HIGH && EstadoPin2 == HIGH ) {

Serial.print("*");
while(EstadoPin6 == HIGH && EstadoPin5 == HIGH && EstadoPin4 == LOW && EstadoPin3 == HIGH && EstadoPin2 == HIGH ){
EstadoPin2 = digitalRead(Pin2);
EstadoPin3 = digitalRead(Pin3);
EstadoPin4 = digitalRead(Pin4);
EstadoPin5 = digitalRead(Pin5);
EstadoPin6 = digitalRead(Pin6);
digitalWrite(Pin12, HIGH);
codigo = 11;
displayOled();
}
}
//Boton # 00111
if (EstadoPin6 == LOW && EstadoPin5 == LOW && EstadoPin4 == HIGH && EstadoPin3 == HIGH && EstadoPin2 == HIGH ) {

Serial.print("#");
while(EstadoPin6 == LOW && EstadoPin5 == LOW && EstadoPin4 == HIGH && EstadoPin3 == HIGH && EstadoPin2 == HIGH ){
EstadoPin2 = digitalRead(Pin2);
EstadoPin3 = digitalRead(Pin3);
EstadoPin4 = digitalRead(Pin4);
EstadoPin5 = digitalRead(Pin5);
EstadoPin6 = digitalRead(Pin6);
digitalWrite(Pin12, LOW);
codigo = 12;
displayOled();
}
}
//Boton MENU 10111
if (EstadoPin6 == HIGH && EstadoPin5 == LOW && EstadoPin4 == HIGH && EstadoPin3 == HIGH && EstadoPin2 == HIGH ) {

Serial.print("MENU");
while(EstadoPin6 == HIGH && EstadoPin5 == LOW && EstadoPin4 == HIGH && EstadoPin3 == HIGH && EstadoPin2 == HIGH ){
EstadoPin2 = digitalRead(Pin2);
EstadoPin3 = digitalRead(Pin3);
EstadoPin4 = digitalRead(Pin4);
EstadoPin5 = digitalRead(Pin5);
EstadoPin6 = digitalRead(Pin6);
codigo = 13;
displayOled();
}
}
//Boton ALTO 01111
if (EstadoPin6 == LOW && EstadoPin5 == HIGH && EstadoPin4 == HIGH && EstadoPin3 == HIGH && EstadoPin2 == HIGH ) {

Serial.print("UP");
while(EstadoPin6 == LOW && EstadoPin5 == HIGH && EstadoPin4 == HIGH && EstadoPin3 == HIGH && EstadoPin2 == HIGH ){
EstadoPin2 = digitalRead(Pin2);
EstadoPin3 = digitalRead(Pin3);
EstadoPin4 = digitalRead(Pin4);
EstadoPin5 = digitalRead(Pin5);
EstadoPin6 = digitalRead(Pin6);
codigo = 14;
displayOled();
}
}
//Boton BAJO 11111
if (EstadoPin6 == HIGH && EstadoPin5 == HIGH && EstadoPin4 == HIGH && EstadoPin3 == HIGH && EstadoPin2 == HIGH ) {

Serial.print("DOWN");
while(EstadoPin6 == HIGH && EstadoPin5 == HIGH && EstadoPin4 == HIGH && EstadoPin3 == HIGH && EstadoPin2 == HIGH ){
EstadoPin2 = digitalRead(Pin2);
EstadoPin3 = digitalRead(Pin3);
EstadoPin4 = digitalRead(Pin4);
EstadoPin5 = digitalRead(Pin5);
EstadoPin6 = digitalRead(Pin6);
codigo = 15;
displayOled();
}
}
//Boton EXIT 00001
if (EstadoPin6 == LOW && EstadoPin5 == LOW && EstadoPin4 == LOW && EstadoPin3 == LOW && EstadoPin2 == HIGH ) {

Serial.print("EXIT");
while(EstadoPin6 == LOW && EstadoPin5 == LOW && EstadoPin4 == LOW && EstadoPin3 == LOW && EstadoPin2 == HIGH ){
EstadoPin2 = digitalRead(Pin2);
EstadoPin3 = digitalRead(Pin3);
EstadoPin4 = digitalRead(Pin4);
EstadoPin5 = digitalRead(Pin5);
EstadoPin6 = digitalRead(Pin6);
codigo = 16;
displayOled();
}
}
}

//Visualización el display
void displayOled(){
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_ncenB10_tr);
if(codigo == 1){
u8g2.drawStr(0,24,"Codigo: 1");
}
if(codigo == 2){
u8g2.drawStr(0,24,"Codigo: 2");
}
if(codigo == 3){
u8g2.drawStr(0,24,"Codigo: 3");
}
if(codigo == 4){
u8g2.drawStr(0,24,"Codigo: 4");
}
if(codigo == 5){
u8g2.drawStr(0,24,"Codigo: 5");
}
if(codigo == 6){
u8g2.drawStr(0,24,"Codigo: 6");
}
if(codigo == 7){
u8g2.drawStr(0,24,"Codigo: 7");
}
if(codigo == 8){
u8g2.drawStr(0,24,"Codigo: 8");
}
if(codigo == 9){
u8g2.drawStr(0,24,"Codigo: 9");
}
if(codigo == 0){
u8g2.drawStr(0,24,"Codigo: 0");
}
if(codigo == 11){
u8g2.drawStr(0,24,"Codigo: *");
}
if(codigo == 12){
u8g2.drawStr(0,24,"Codigo: #");
}
if(codigo == 13){
u8g2.drawStr(0,24,"Codigo: MENU");
}
if(codigo == 14){
u8g2.drawStr(0,24,"Codigo: UP");
}
if(codigo == 15){
u8g2.drawStr(0,24,"Codigo: DOWN");
}
if(codigo == 16){
u8g2.drawStr(0,24,"Codigo: EXIT");
}
if(codigo == 17){
u8g2.drawStr(0,24,"Preparado");

}
} while ( u8g2.nextPage() );
}