Nuestra entrada de blog de hoy se basa en un proyecto que hemos creado recientemente como parte de un taller con una clase escolar.
El objetivo principal es construir y programar un dispositivo de trabajo con componentes existentes y las bibliotecas y ejemplos disponibles de varias fuentes.
Para la realización necesitamos los siguientes componentes:
AZ-Delivery Nano V3
Pensión de entrega AZ
AZ-Delivery Puentes enchufables m/m
Entrega AZ Teclado Matriz 4x4
Módulo de zumbador AZ-Delivery pasivo
Módulo detector de movimiento AZ-Delivery
AZ-Delivery Pantalla OLED I2C de 0,96 pulgadas
Pinout:
Nano V3 |
Módulo de teclado 4x4 |
Pantalla Oled |
Zumbador |
Movimiento |
D2 |
1 |
|
|
|
D3 |
2 |
|
|
|
D4 |
3 |
|
|
|
D5 |
4 |
|
|
|
D6 |
5 |
|
|
|
D7 |
6 |
|
|
|
D8 |
7 |
|
|
|
D9 |
8 |
|
|
|
3V3 |
|
Vcc |
|
|
Gnd |
|
Gnd |
- |
Gnd |
A4 |
|
Sda |
|
|
A5 |
|
Scl |
|
|
D11 |
|
|
S |
|
5v |
|
|
|
Vcc |
D10 |
|
|
|
Medio |
Paso 1: Configurar el teclado
Conecte los pines 1-8 del teclado a los pines D2 - D9 en Nano
Sketch -> Incluir biblioteca -> Administrar bibliotecas
Buscar "teclado"
Teclado de Mark Stanley, Alexander Brevig
Intallieren
Archivo -> Ejemplos -> Teclado -> HelloKeypad
Personalizar: ROWS y COLS cada 4
Añadir A, B, C y D
Compruebe la configuración en Herramientas:
Junta: Arduino Nano
Procesador: ATmega 328P (antiguo cargador de arranque)
Puerto: puerto SELECT COM
Abra el monitor serie, ajuste la velocidad en baudios a 9600.
#include <Keypad.h>
const byte ROWS n.o 4; cuatro filas
const byte COLS n.o 4; tres columnas
teclas char[ROWS][COLS] ?
'1','2','3','A',,
'4','5','6','B'',
'7','8','9','C',,
'*','0','''','D''
};
byte rowPins[ROWS] á .9, 8, 7, 6; conectar a los pines de fila del teclado
byte colPins[COLS] - .5, 4, 3, 2; conectar a los pines de columna del teclado
Teclado del teclado: teclado ( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup()"
Serial.begin(9600);
}
void loop()"
char key á keypad.getKey();
si (clave)
Serial.println(clave);
}
}
Carga y prueba
Archivo -> Guardar en -> HelloKeypad
Paso 2: Configurar la pantalla
Conecte los pines de la siguiente manera:
Pantalla Nano V3
GND GND
VCC 3V3
SCL A5
ASD A4
Tomamos la biblioteca SSD1306Ascii y extendemos nuestro código de la siguiente manera:
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#define I2C_ADDRESS 0x3C
#define RST_PIN -1
SSD1306AsciiWire oled;
en configuración void()
Wire.begin();
Wire.setClock(400000L);
#if RST_PIN >
oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN);
#else - RST_PIN > 0
oled.begin(&Adafruit128x64, I2C_ADDRESS);
#endif - RST_PIN > 0
oled.set2X(); el doble del tamaño de la fuente
Ahora vamos a crear una función que envía el carácter a nuestra pantalla:
void print2oled(char oledText)
oled.setFont(System5x7);
oled.clear();
oled.println(oledText);
retardo(500);
}
Y llame a esta función en el loop():
si (clave)
Serial.println(clave);
print2oled(clave);
}
Resultado: Al pulsar el botón, el botón pulsado aparece en la pantalla.
Siguiente paso: leemos el sensor IR
Conectar:
IR Sensor Nano V3
VCC 5V
Medio D10
GND GND
Agregaremos lo siguiente al código:
pinmode(10, INPUT); El pin D10 se utiliza como INPUT
bool detectado - falso; ¿Se detectó movimiento?
y hacer una función que consulta el sensor:
anular checkPIR()"
si digitalread(PIR)
detectado s verdadero;
Serial.println("Movimiento capturado");
}
Más
detectado: falso;
Serial.println("sin movimiento");
}
Den Buzzer f'r den Alarmton schlie-en wir wie folgt an:
Buzzer Nano V3
- GND
S D11
Wir f-gen folgendes zum Sketch hinzu:
Altavoz int 11; Pin digital 11
pinMode(speaker, OUTPUT);
und die folgende Funktion, um zu testen ob der Buzzer geht:
altavoz vacíoTest()
tono (altavoz, 600, 500);
retardo(100);
tono (altavoz, 700, 100);
retardo(100);
tono (altavoz, 800, 750);
retraso(200);
}
Nun sind alle ben-tigten Sensoren und Module soweit funktionsf-hig und ansprechbar/auslesbar.
Wir speichern den Sketch mittels "Datei" -> "Speichern unter" als Alarmanlage
Hier der komplette Quellcode von der Alarmanlage mit allen Funktionen:
#include <Teclado.H> #include <Alambre.H> #include "SSD1306Ascii.h" #include "SSD1306AsciiWire.h" #define I2C_ADDRESS 0x3C #define RST_PIN -1 #define Pir 10 Bool Detectado = Falso; wurde bewegung erfasst? Bool Armadas = Falso; ist der Alarm scharf geschaltet? SSD1306AsciiWire Oled; Const Byte Filas = 4; cuatro filas Const Byte COLS = 4; tres columnas Char Llaves[Filas][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; Byte rowPins[Filas] = {9, 8, 7, 6}; conectar a los pines de fila del teclado Byte colPins[COLS] = {5, 4, 3, 2}; conectar a los pines de columna del teclado Teclado Teclado = Teclado( makeKeymap(Llaves), rowPins, colPins, Filas, COLS ); Int Altavoz = 11; Pin digital 11 Char* Pincode = "1337"; Establezca el código PIN necesario. Int currentPosition = 0; Realiza un seguimiento de la posición del código introducido. Vacío Configuración(){ Serial.Comenzar(9600); Alambre.Comenzar(); Alambre.setClock(400000L); #if RST_PIN >= 0 Oled.Comenzar(&Adafruit128x64, I2C_ADDRESS, RST_PIN); #else RST_PIN > 0 Oled.Comenzar(&Adafruit128x64, I2C_ADDRESS); #endif RST_PIN > 0 Oled.set2X(); doppelte gr'e der Schrift pinMode(10, Entrada); pinMode(Altavoz, Salida); speakerTest(); } Vacío Bucle(){ Char Clave = Teclado.getKey(); checkPIR(); Int L; Si (Clave){ Señal sonora(); Serial.println(Clave); print2oled(Clave); Si (Int(Clave) != 0) { Compruebe si hay un valor presente. Para (L=0; L<=currentPosition; ++L) { } Si (Clave == Pincode[currentPosition]) Si el valor es correcto, aumente la posición del código en uno. { ++currentPosition; Si (currentPosition == 4) Si las cuatro partes del código son correctas, abra la puerta. { Oled.Claro(); unlockDoor(); currentPosition = 0; } } Más { invalidCode(); Si alguna parte del código está mal, no abra la puerta. currentPosition = 0; } } } Si (Armadas){ alarmanlage scharf? Si (Detectado){ playAlarm(); } } } Vacío print2oled(Char oledText){ Oled.Setfont(fixed_bold10x15); Oled.Impresión(oledText); Retraso(500); } Vacío checkPIR(){ Si (digitalRead(Pir)){ Detectado = Verdad; Serial.println("Bewegung erfasst"); Retraso(50); } Más { Detectado = Falso; Serial.println("keine Bewegung"); Retraso(50); } } Vacío speakerTest(){ Tono(Altavoz, 600, 50); Retraso(100); Tono(Altavoz, 700, 50); Retraso(100); Tono(Altavoz, 800, 200); Retraso(200); } Vacío Señal sonora(){ Tono(Altavoz, 2000, 100); } Vacío beepOK(){ Tono(Altavoz, 3000, 50); Retraso(50); Tono(Altavoz, 3300, 50); } Vacío invalidCode() { Oled.Claro(); Oled.println("Fehler"); Tono(Altavoz, 300,150); Retraso(250); Tono(Altavoz, 220, 300); Retraso(1000); Oled.Claro(); } Vacío unlockDoor() { Si (Armadas){ Armadas=Falso; Serial.println("Deaktiviert de alarma"); Oled.Setfont(fixed_bold10x15); Oled.Claro(); Oled.println("Aus"); Retraso(1000); Oled.Claro(); } Más{ Armadas=Verdad; Serial.println("Alarma aktiviert!"); Oled.Setfont(fixed_bold10x15); Oled.Claro(); Oled.println("Aktiv!"); Retraso(1000); Oled.Claro(); } Tono(Altavoz, 1000, 50); Retraso(50); Tono(Altavoz, 1200, 50); Retraso(60); Tono(Altavoz, 1300, 50); Retraso(50); Tono(Altavoz, 1000, 50); Retraso(60); Tono(Altavoz, 1200, 50); Retraso(50); Tono(Altavoz, 1300, 50); Retraso(60); Tono(Altavoz, 1000, 50); Retraso(50); Tono(Altavoz, 1200, 50); Retraso(60); Tono(Altavoz, 1300, 100); Retraso(50); } Vacío playAlarm(){ Serial.println("La alarma! ¡Alarma! ¡La alarma!"); Tono(Altavoz, 2000, 400); Retraso(500); Tono(Altavoz, 2000, 400); Retraso(500); Tono(Altavoz, 2000, 400); Retraso(500); Tono(Altavoz, 2000, 400); Retraso(500); Oled.Setfont(fixed_bold10x15); Oled.Claro(); Oled.println(" Alarma!!!"); }
1 comentario
Rolando
Le istruzioni del programma si scrivono in inglese: per esempio #include , non Filo.h. Tralascio tutti gli altri errori ; ci sarebbe da scriverci un romanzo,
Die Programmanweisungen sind in englischer Sprache verfasst: Zum Beispiel #include , nicht Filo.h. Ich lasse alle anderen Fehler weg; Es würde einen Roman geben, über den man schreiben könnte.
Scusami se nella traduzione in tedesco ci sono degli errori…
Entschuldigung, wenn die deutsche Übersetzung fehlerhaft ist …
Firmato: un principiante