Mein Arduino Programm für einen Tresor funktioniert nicht?

Ich muss für die Schule einen Tresor mit einem 3x4Keypad , einem Servo und einem Lcd Display programmieren. Dafür habe ich einen Arduino UNO. Das Programm funktioniert aber nicht so wie ich es will.

Wenn ich eine Taste drücke, die nicht # oder * ist soll sie auf dem Display angezeigt werden und auf der Variable inputPasswort gespeichert werden. Diese sollen aber nicht immer in der ersten Spalte stehen, sondern sollen nebeneinander in einer Zeile angezeigt werden. Wenn ich # drücke soll der Arduino prüfen ob das eingegebene Passwort richtig ist. Wenn das der Fall ist, soll sich der Servo öffnen und das Display "Passwort richtig" anzeigen. Wenn nicht soll der Servo geschlossen bleiben und das Display soll "Passwort falsch" anzeigen. Wenn * gedrückt wird soll das Programm alle bisher eingegebenen Zahlen von der Variable inputPasswort löschen.

Das Display zeigt die Zahlen aber nur kurz und immer an verschiedenen Stellen an. Der Arduino erkennt auch nicht wenn das Passwort richtig ist. Kann mir bitte jemand helfen?

So sieht mein Programm bisher aus:

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Servo.h>
#include <Keypad.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
int cursorPosition = 0; // Variable für die Position des Cursors
Servo IHateThis;    // Servo heißt jetzt "IHateThis"
const int ROW_NUM = 4;  // Anzahl der Tastenfeld Reihen
const int COLUMN_NUM = 3; // Anzahl der Tastenfeld Zeilen
byte pin_rows[ROW_NUM] = { 9, 8, 7, 6 };  //die Pins für die Reihen des Tastenfelds
byte pin_column[COLUMN_NUM] = { 5, 4, 3 }; //die Pins für die Zeilen des Tastenfelds
char keys[ROW_NUM][COLUMN_NUM] = {
 { '1', '2', '3' },
 { '4', '5', '6' },
 { '7', '8', '9' },
 { '*', '0', '#' }
};
Keypad keypad = Keypad(makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM);
char Passwort[5] = { '0', '1', '2', '3', '#' }; //Array mit Länge des Passworts (4 + #) und dem Passwort selbst (0123)
String inputPasswort;  // Variable um die eingegebenen Tasten abzuspeichern
void setup() {
 inputPasswort.reserve(4); 
 lcd.init();
 lcd.clear();
 lcd.backlight(); //Das Display soll beleuchtet sein
 IHateThis.attach(12);  //Servo ist an Pin 12 angeschlossen
 IHateThis.write(140);  //Servo ist anfangs in der Position 140 (Tresor ist zu)
}
void loop() {
 char Taste = keypad.getKey();    //Variable "Taste" ist hier definiert
 if (Taste != '*' && Taste != '#') { 
  lcd.setCursor(cursorPosition, 0); // Cursor position at position 0 of the first row of the LCD.
  lcd.print(Taste);         //Wenn eine Taste außer * und # gedrückt wird, wird diese auf dem Display angezeigt
  cursorPosition = cursorPosition + 1;
 }
 if (Taste == '#') { //Nachdem # gedrückt wurde, wird überprüft ob das eingegebene Passwort dem tatsächlichen Passwort entspricht
  if (inputPasswort == Passwort) {   //Wenn das eingegebene Passwort dem tatsächlichen Passwort entspricht, wird für 3 Sekunden "Passwort richtig" angezeigt. Danach wird der inhalt der Variable inputPasswort gelöscht, der Servo geöffnet, die Variable cursorPosition auf 0 zurückgesetzt und das Display geleert.
   lcd.setCursor(0, 0);
   lcd.print("Passwort richtig");
   delay(3000);
   inputPasswort = "";
   lcd.clear();
   cursorPosition = 0;
   lcd.setCursor(cursorPosition, 0);
   IHateThis.write(30);
  }
  if (inputPasswort != Passwort) {     //Wenn das eingegebene Passwort nicht dem eingegebenen Passwort entspricht, wird "Passwort falsch" für 3 Sekunden angezeigt, und danach die reset schleife ausgeführt
   lcd.clear();
   lcd.setCursor(0, 0);
   lcd.print("Passwort falsch");
   delay(3000);
   reset();
  }
 }
 if (Taste == '*') { //Wenn * gedrückt wird, wird die reset Schleife ausgeführt
  reset();
 }
}
void reset() {      
 inputPasswort = "";   //Alles was auf der Variable inputPasswort gespeichert war, wird gelöscht
 lcd.clear();       //Display wird geleert
 cursorPosition = 0;   //Die Variable cursorPosition wird auf 0 gesetzt
 IHateThis.write(140);  //Der Servo wird geschlossen
}
Arduino, Code, Arduino Uno
Mehrer micro Servos an Arduino anschließen?

Hallo, ich habe momentan ein Projekt am Laufen und stoße auf mehrere Probleme. Mein Ziel ist es, 3 Servos an ein Arduino anzuschließen und einen um 180 Grad drehen, wenn ein Button gedrückt wurde, den anderen mit einer Fotodiode und den letzten mittels eines Reedsensors. Ich habe den Schaltkreis schon erstellt, jedoch nur für 2 Servos. Online stoße ich immer wieder darauf, dass man mehrere Servos nicht direkt über die Stromversorgung des Arduino versorgen sollte. Ich habe nun ein online-Video gefunden, wobei die Person im Video die Servos mittels einer 9-V-Batterie betreibt. Wenn ich diesen Schaltkreis jedoch in Tinker CAD simuliere, wird mir angezeigt, dass die Spannung zu groß für die Servos sei. Wie kann ich nun, ohne dass die Servos oder der Arduino kapput gehen, 3 Servos über einen Arduino Uno 3 steuern?

Vielen Dank im Vorab für jede Antwort.

Code :

#include <Servo.h>

Servo servo1;

Servo servo2;

int pos = 0;

int sensorWert = 0;

int onTime = 200;

int offTime = 200;

int eingang = A0;

int buttonPin = 2;

int servoPin1 = 9;

int servoPin2 = 10;

void setup()

{

  Serial.begin(9600);

  servo1.attach(servoPin1);

  servo2.attach(servoPin2);

  pinMode(buttonPin, INPUT_PULLUP);

}

void loop()

{

  sensorWert = analogRead(eingang);

Serial.print("Sensorwert = " ); 

  Serial.println(sensorWert);

  int buttonState = digitalRead(buttonPin);

  

  if (buttonState == LOW) 

  {

    servo2.write(180);

  }

  delay(15);

    

  if (sensorWert > 100)

  {

    servo1.write(180);

  }

}

Bild zum Beitrag
Elektrik, Arduino, Schaltung, Servomotor
Wie kann ich einen Takt von 50kHz mit dem Arduino Mega2560 erzeugen?

Hallo zusammen,

Wie oben schon beschrieben die Frage, wie ich einen Takt von 50kHz mit dem Arduino Mega2560 erzeugen kann.

Das ist mein derzeitiger Sketch:

const int outputPin = 5;  // digitale Ausgangspin
unsigned long startTime;   // Variable zur Speicherung des Startzeitpunkts


void setup() {
  pinMode(outputPin, OUTPUT);  // Setzen des Pin als Ausgang
  Serial.begin(9600);  // Starten der serielle Kommunikation mit 9600 Baud
}


void loop() {
  // Einschaltphase messen
  startTime = micros();  // Aktuelle Zeit speichern
  digitalWrite(outputPin, HIGH);  // Pin auf HIGH
  delayMicroseconds(10);  // Warten für die halbe Periode (T_high)
  unsigned long onTime = micros() - startTime;  // Berechnen Sie die Einschaltzeit in Mikrosekunden


  // Ausschaltphase messen
  startTime = micros();  // Aktuelle Zeit speichern
  digitalWrite(outputPin, LOW);  // Pin auf LOW 
  delayMicroseconds(10);  // Warten für die andere halbe Periode (T_low)
  unsigned long offTime = micros() - startTime;  // Berechnen der Ausschaltzeit in Mikrosekunden


  // Ausgabe der gemessenen Zeiten
  Serial.print("Einschaltzeit: ");
  Serial.print(onTime);
  Serial.print(" µs  ----  ");
  Serial.print("Ausschaltzeit: ");
  Serial.print(offTime);
  Serial.println(" µs");


  delay(1000);  // Eine Sekunde warten, bevor der nächste Zyklus beginnt
}


// Soll Periodendauer = 20µs -> f = 50kHz

Leider erhalte ich mit diesem Code folgende Ausgabe:

Einschaltzeit: 20 µs  ----  Ausschaltzeit: 16 µs
Einschaltzeit: 16 µs  ----  Ausschaltzeit: 20 µs
Einschaltzeit: 16 µs  ----  Ausschaltzeit: 20 µs
Einschaltzeit: 16 µs  ----  Ausschaltzeit: 20 µs
Einschaltzeit: 20 µs  ----  Ausschaltzeit: 16 µs
Einschaltzeit: 16 µs  ----  Ausschaltzeit: 20 µs
Einschaltzeit: 16 µs  ----  Ausschaltzeit: 20 µs
Einschaltzeit: 16 µs  ----  Ausschaltzeit: 20 µs
Einschaltzeit: 20 µs  ----  Ausschaltzeit: 20 µs
Einschaltzeit: 16 µs  ----  Ausschaltzeit: 16 µs
... usw.

Mir ist klar, das der Controller durch die Funktion Serial.print() und auch die delayMicroseconds() zeit verbraucht.

Gibt es aber eine möglichkeit möglichst genau einen Takt von 50kHz mit dem Arduino zu erzeugen?

Vielen Dank!

Computer, programmieren, Elektrik, Arduino, Physik, Sketch, arduino mega

Meistgelesene Beiträge zum Thema Arduino