Hallo Leute,
ich bin was die Arduino-Geschichte betrifft relativ neu dabei und habe noch nicht so den Überblick.
Um etwas mit der Materie warm zu werden haben ich mir ein Project vorgenommen.
Genauer gesagt habe ich mir einen Staubsauger Roboter gebaut und bin nun daran die ganze Sache nach und nach zu Programmieren.
Ich hatte früher schon so einen gebaut der mit einem Atmega16 lief, ich wollte aber das Design ändern deswegen habe ich die Teile des alten für den neuen verwendet, unter anderem auch die Tastatur.
Betrieben wird der Roboter mit einem Arduino Mega2560, ich weis etwas übertrieben, aber ich hatte den und deswegen habe ich den eingebaut
Zum Problem:
Die Tastatur ist an A0 angeschlossen und funktioniert als Spannungsteiler.
Je nachdem welche Taste gedrückt wird, wird ein Widerstand mit R2 parallel geschaltet und der Wert ändert sich.
Soweit so gut und das Funktioniert auch.
Nun muss ich natürlich die Spannung überwachen damit die Batterie nicht komplett Leer gelutscht wird. Deswegen wird an A1 auch über einen Spannungsteiler die 12 V eingespeist ausgewertet und alle 10 Sekunden auf dem Display angezeigt.
Auch das Funktioniert soweit.
Das Problem ist wenn ich die Tastaturabfrage Routine ausklammere, dann funktioniert die Spannungsanzeige ohne Probleme. Alle 10 Sekunden wird die Spannung gemessen und angezeigt. Der gemessene Wert entspricht so ziemlich genau dem Wert den mein Multimeter anzeigt.
Habe ich die Tastatur aktiv dann wird beim ersten mal die Spannung korrekt angezeigt danach wird immer 15.06 Volt angezeigt. Dazwischen erscheint dann zwar mal immer wieder der richtige Wert, aber das ist selten.
Wenn ich mir den Wert des Eingangs der Spannungsüberwachung (A1) anschaue wird immer 1023 (entspricht den 5 Volt) eingelesen es liegen aber definitiv 4,irgendwas Volt an und keine 5 Volt.
Ich habe keine Ahnung was da schief läuft. Vielleicht kann sich jemand ja mal das Script ansehen und findet den Fehler.
#include <LiquidCrystal.h>
#include <TimerOne.h>
LiquidCrystal lcd(32, 30, 22, 24, 26, 28);
//Tastatur
int analogpin_1 = A0; //Tastatur
int tastatur_wert = 0;
int taste = 0;
//12 Volt Spannungsüberwachung
int analogpin_2 = A1;
int spannungs_wert = 0;
void setup()
{
//Timer für Spannungsanzeige
Timer1.initialize(10000000); // 10000000µs = 10s
Timer1.attachInterrupt(spannungsIsr); // soll "timerIsr()" benutzen
interrupts(); // Ermöglichen von Interrupts
Serial.begin(9600);
lcd.begin(16,2);
lcd.print("Roboter V2.0.");
}
void loop()
{
tastatur();
}
void tastatur()
{
tastatur_wert = analogRead(analogpin_1);
if (tastatur_wert<1023)
{
if (tastatur_wert > 235 & tastatur_wert < 245)
{
taste = 1;
}
if (tastatur_wert > 715 & tastatur_wert < 725)
{
taste = 2;
}
if (tastatur_wert > 950 & tastatur_wert < 960)
{
taste = 3;
}
if (tastatur_wert > 155 & tastatur_wert < 165)
{
taste = 4;
}
if (tastatur_wert > 325 & tastatur_wert < 335)
{
taste = 5;
}
if (tastatur_wert > 910 & tastatur_wert < 920)
{
taste = 6;
}
if (tastatur_wert > 518 & tastatur_wert < 528)
{
taste = 7;
}
if (tastatur_wert > 280 & tastatur_wert < 290)
{
taste = 8;
}
if (tastatur_wert > 860 & tastatur_wert < 870)
{
taste = 9;
}
Serial.print(taste);
Serial.println("");
// Serial.print(tastatur_wert);
// Serial.println("");
delay(300);
}
taste = 0;
}
void spannungsueberwachung()
{
float spannung;
spannungs_wert = analogRead(analogpin_2); //12 Spannung einlesen
spannung = (spannungs_wert*(5.0/1023)*3.0125);
lcd.setCursor(0,1);
lcd.print("Batt.");
lcd.setCursor(6,1);
lcd.print(spannung);
lcd.setCursor(12,1);
lcd.print("Volt");
Serial.print(spannungs_wert);
Serial.print(" - ");
Serial.println(spannung);
}
void spannungsIsr()
{
spannungsueberwachung();
}
Hoffende Grüße
Thomas