Digitales Labor NR05: Code-Sperre

Wir setzen die Artikelserie über die Verwendung der Funktionen des Digital Lab- Kits NR05 fort , um die Programmierung von Mikrocontrollern am Beispiel von Arduino zu untersuchen und nützliche elektronische Geräte zu entwerfen.



Unser Material gibt nicht vor, ein fertiges Design zu sein, erfüllt jedoch, wie Sie sehen werden, alle Grundfunktionen einer Codesperre vollständig und kann als gutes Beispiel für die Funktionen von Mikrocontrollern und die Verwendung externer Plug-Ins dienen. Das Programm für den Mikrocontroller kann nach eigenem Ermessen überarbeitet werden, indem die Funktionen des Schlosses hinzugefügt oder geändert werden und gleichzeitig Ihr Programmierwissen erweitert wird.

Wir werden zunächst die Tatsache nutzen, dass die Erweiterungskarte, die Teil des Sets ist, über ein zweizeiliges Flüssigkristalldisplay sowie 5 Tasten verfügt. Wir verwenden diese Elemente, um ein Zahlenschloss zu erstellen.

Stellen wir folgende Anforderungen:
1. Es gibt 5 Schaltflächen zur Eingabe des Codes, der das Schloss öffnet.
2. Die Schaltfläche ganz links entspricht Code 1, dann von links nach rechts - 2,3,4,5;
3. Die Anzahl der Stellen des Eingabecodes kann beliebig sein (innerhalb angemessener Grenzen) und einfach im Programm installiert werden.
4. Der gewählte Code wird mit Sternchen angezeigt.
5. Wenn der eingegebene Code mit dem beispielhaften übereinstimmt, wird dem Aktuator ein positiver Impuls der im Programm angegebenen Dauer zugeführt;
6. Wenn der Code falsch eingegeben wird, wird eine Fehlermeldung angezeigt.
7. Wenn Sie den Code teilweise eingeben, werden die gewählten Werte nach einer Weile zurückgesetzt.
8. Wir verwenden das Display, die RGB-LED und den im Kit enthaltenen Sound-Emitter, um benutzerfreundliche Informationen anzuzeigen.
9. Wir werden ein echtes elektromechanisches Schloss öffnen, das mit 12 Volt betrieben wird.

Jetzt nehmen wir das Gerät auf, das die Öffnungsspannung an das Schloss anlegt. Diese Spannung beträgt gemäß dem Pass des elektromechanischen Schlosses, das wir öffnen werden, 12 Volt bei einem Strom von etwa 1 Ampere. Die Erweiterungskarte des NR05-Kits kann mit solchen Spannungen und Strömen nicht arbeiten, daher wird ein zusätzliches Schaltmodul benötigt. Solche Module können MP515- Relais sein, die vom Master Kit angeboten werden , oder Relaiseinheiten MP2211 , MP4411Je nachdem, ob wir nicht nur das Schloss, sondern auch andere Geräte steuern möchten, schalten Sie beispielsweise das Licht ein, wenn die Tür geöffnet wird. Alle diese Geräte sind mit den Arduino-Steuersignalpegeln kompatibel. In unserem speziellen Fall verwenden wir MP2211 - ein Modul mit zwei Relais.

In Anbetracht dessen werden wir ein Verbindungsdiagramm der verwendeten Geräte zeichnen:



Wenn Sie sich die Markierung der Erweiterungskarte genau ansehen, werden Sie feststellen, dass der grüne Kanal der GRÜNEN RGB-LED und der Ausgang zum CH3-Relais mit einem Pin des D9 Arduino Nano verbunden sind. In diesem Fall ist dies zulässig, da der Eingang der Relaissteuerschaltung einen ausreichend hohen Eingangswiderstand aufweist und Pin D9 nur als digitaler Ausgang verwendet wird. Im Allgemeinen sollten Sie überprüfen, ob die Pins der von Ihnen verwendeten Platine mit demselben Arduino-Pin verbunden sind, und diese Situation vermeiden.

Das Schloss verbraucht während des Betriebs ziemlich viel Strom, daher versorgen wir es und den Steuerkreis getrennt.

Hier ist eine Skizze, die in Arduino, einem Spoiler, arbeitet
// RGB-
// NR05
//-------------------------------------------------------------------
// LiquidCrystalRus
#include <LiquidCrystalRus.h>
#include <LineDriver.h>
#include <LiquidCrystalExt.h>
// RGB-
#define red 5
#define blue 6
#define green 9
#define beep 12
// ,
#define NUM_KEYS 5
// ( )
int adcKeyVal[NUM_KEYS] = {30, 150, 360, 535, 760};
///////////////////////////////////////////////////////////
// ,
#define codeLength 6
// , , . codeLength
const int codeOrigin[codeLength] = {1, 2, 3, 4, 5, 3};
// ,
const int unlockTime = 400;
///////////////////////////////////////////////////////////
//
int codePressed[codeLength];
// ( )
int pressCount;
//
unsigned long oldTime;
unsigned long currentTime;
const int timeout = 5; // , .
//-----------------------------------------------------------------------
// , RS,EN,DB4,DB5,DB6,DB7
LiquidCrystalRus lcd(A1, A2, A3, 2, 4, 7);

//-----------------------------------------------------------------------
// 1 Arduino
void setup()
{
// LCD: 16 2
lcd.begin(16, 2);
// ()
// « »
lcd.print(« »);
//
lcd.setCursor(0,1);
lcd.print(«t.: „);
lcd.print(unlockTime);
lcd.print(“ »);
// 2000 = 2
delay(2000);
//
lcd.clear();
//
pressCount = 0;
// « » RGB-
pinMode(red, OUTPUT);
pinMode(blue, OUTPUT);
pinMode(green, OUTPUT);
pinMode(beep, OUTPUT);
}

//-----------------------------------------------------------------------
// setup .

void loop() {
// ( ),
currentTime = millis();
// ,
if (currentTime — oldTime <= timeout*1000){
// key
int key;
// , get_key
key = get_key();
lcd.setCursor(0, 0);
lcd.print(« :»);
//
digitalWrite(blue, HIGH);
if (key > 0){ //
codePressed[pressCount] = key; //
// (50 )
digitalWrite(beep, HIGH);
delay(50);
digitalWrite(beep, LOW);
// ,
lcd.setCursor(pressCount, 1);
lcd.print('*');
digitalWrite(blue, LOW);
delay(200);
digitalWrite(blue, HIGH);
pressCount++; //
//
oldTime = currentTime;
}
}
// ,
else{
pressCount = 0;
lcd.clear();
oldTime = currentTime;
}
// , : codeOrigin codePressed
if (pressCount == codeLength){
int compareResult = 1;
for (int i = 0; i < codeLength; i++)
if (codeOrigin[i] != codePressed[i])
compareResult = 0; //
//
if (compareResult == 1){ //
digitalWrite(blue, LOW);
digitalWrite(green, HIGH);
lcd.setCursor(0, 0);
lcd.print(« „);
delay(unlockTime);
digitalWrite(green, LOW);
pressCount = 0;
delay(1000);
lcd.clear();
digitalWrite(blue, HIGH);
}
//
else {
lcd.setCursor(0, 1);
lcd.print(“ »);
digitalWrite(blue, LOW);
digitalWrite(red, HIGH);
digitalWrite(beep, HIGH);
delay(2000);
pressCount = 0;
lcd.clear();
digitalWrite(beep, LOW);
digitalWrite(blue, HIGH);
digitalWrite(red, LOW);
}
}
}

//-----------------------------------------------------------------------
//
// ,
// ,
int get_key()
{
int input = analogRead(A6);
int k;
for(k = 0; k < NUM_KEYS; k++)
if(input < adcKeyVal[k])
return k + 1;
return 0;
}
//


Die Skizzenliste enthält detaillierte Kommentare, die Ihnen das Verständnis des Programms erleichtern.
Trotzdem machen wir Sie auf einige seiner Funktionen aufmerksam.
Wie wir bereits geschrieben haben, wird in der Erweiterungskarte ein Tastenverbindungsschema verwendet, das nur einen Arduino-Pin verwendet. Ein solches Schema spart die Mikroprozessorausgänge, ermöglicht jedoch nicht das gleichzeitige Drücken mehrerer Tasten gleichzeitig, in unserem Fall ist dies jedoch nicht erforderlich. Beachten Sie die Funktion get_key am Ende der Skizze. Wenn keine Tasten gedrückt werden, gibt die Funktion 0 zurück, wenn gedrückt, dann die Nummer der gedrückten Taste.
Schauen Sie sich auch die Implementierung des Vergleichs zweier Arrays an: Referenz- und typisierte Codes:

int compareResult = 1;
für (int i = 0; i <codeLength; i ++)
if (codeOrigin [i]! = codePressed [i])
compareResult = 0; // wenn mindestens

ein Elementpaar nicht gleich ist Die Frage des Algorithmus für einen solchen Vergleich wird häufig in Programmierforen diskutiert, aber jedes Mal kommt es auf einen elementweisen Vergleich an, der in unserem Fall verwendet wird. Die Variable compareResult bleibt gleich 1, wenn die Elemente von Arrays mit demselben Index gleich sind, und wird gleich 0, wenn mindestens ein Elementpaar nicht übereinstimmt.
Zur Anzeige kyrillischer Zeichen wird die von Ilya Danilov entwickelte LiquidCrystalRus-Bibliothek verwendet. Damit die Bibliothek ordnungsgemäß funktioniert, muss der Titel unserer Skizze drei Zeilen enthalten:

#include <LiquidCrystalRus.h>
#include <LineDriver.h>
#include <LiquidCrystalExt.h>

Die Initialisierung der Anzeige sollte folgendermaßen aussehen:

LiquidCrystalRus lcd (A1, A2, A3, 2, 4, 7);

Die Länge des Eingabecodes wird durch die vordefinierte codeLength-Konstante angegeben, z. B. für einen Sechs-Klick-Code

#define codeLength 6

Ein Array von Referenzwerten für einen 6-Klick-Code wird in der folgenden Zeile angegeben:

const int codeOrigin [codeLength] = {1, 2, 3, 4, 5, 3} ;;

Die Anzahl der Werte in geschweiften Klammern muss gleich codeLength sein. Wenn mehr Werte vorhanden sind, gibt der Compiler einen Fehler aus. Wenn weniger vorhanden sind, tritt kein Fehler auf. Es werden jedoch zufällige Werte als fehlende Elemente verwendet, sodass kein Code eingegeben werden kann, der die Sperre öffnet.

Alle 5 Sekunden setzt das Programm die eingegebenen Codeelemente zurück. Wenn die Taste gedrückt wurde, wird die Zeit des Drückens gespeichert und der Countdown des Fünf-Sekunden-Intervalls beginnt erneut. Dies wird mithilfe der integrierten Funktionen millis () implementiert, die die Anzahl der Millisekunden zurückgeben, die seit dem Start der Skizze vergangen sind, sowie der Variablen oldTime und currentTime.

Hier ist ein kurzes Video, das die Funktionsweise der Codesperre demonstriert:



Für neugierige und neugierige elektronische Programmierer können Sie einige weitere Ideen für die Selbstfinalisierung der Skizze und die Aufnahme von Modulen in die Schaltung einbringen, die die Fähigkeiten des Schlosses erweitern. Geben Sie beispielsweise einen Mastercode in das Programm ein, mit dessen Hilfe das Schloss in den Programmiermodus versetzt wird und die gedrückten Tasten als Referenzcode gespeichert werden, um diesen Code in der Skizze nicht zu ändern. Das Programmieren eines neuen Codes endet, wenn das Intervall zwischen den Klicks eine bestimmte Zeit überschreitet.

Oder erstellen Sie basierend auf Material zur Interaktion von Arduino mit einem Smartphone über Bluetooth ein Schloss, das mit einem Code geöffnet wird, der von diesem Smartphone gesendet wird.

Sie können auch einfach den drahtlosen Steuerkanal in unser Gerät eingeben. Dazu reichen zwei Module aus: der Sender-Sender MP910 und ein Einkanalempfänger mit Relaisausgang MP911 , der mit einer Frequenz von 433 MHz arbeitet. Die Relaiskontakte des MP2211-Moduls sind parallel zur Taste auf der Fernbedienung geschaltet, und das Relais des Empfängermoduls ist mit dem Schloss verbunden. Der Steuerabstand kann bis zu 100 m

betragen. Studieren Sie Arduino, studieren Sie Mikrocontroller und deren Programmierung - und Sie können viele intelligente und nützliche elektronische Geräte erstellen!

Source: https://habr.com/ru/post/de392559/


All Articles