hallo leute,
habe ein kleines problem.
ich muss spannungen messen und dazu die lineare derhzahl mithilfe eines
arduino nano ausrechnen und an einem display ausgeben.
ich habe 3 analoge eingänge mit dazu zugeteilten digitalpins.
je nachdem, an welche maximalspannung anliegt, liegt ein high-pegel am
vorgesehenen digitalpin. der gibt dem arduino den befehl, den
dazugehörigen analogpin zu messen und die drehzahl zu berechnen sowie am
display auszugeben.
hab die schaltung soweit fertig. nur macht der arduino nano nicht das,
was es soll. schicke euch mal den programmcode für den fall, dass im
code ein fehler vorliegt. ich hab leider keine gefunden. vielen dank
schonmal im vorraus.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); //In dieser Zeile wird
festgelegt, welche Pins des Mikrocontrollerboards für das LCD verwendet
wird
int a,b,c;
float f,g,h;
int k,l,m;
float n,o,p;
int i = 1023;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(8,INPUT); // Digitalpin 8 als Eingang
setzen
pinMode(10,INPUT); // Digitalpin 10 als Eingang
setzen
pinMode(12,INPUT); // Digitalpin 12 als Eingang
setzen
lcd.init(); // Initialisierung Display
lcd.backlight(); // Hintergrundbeleuchtung
Display
}
void loop() {
k = digitalRead(8); // Eingang vom Ausgang OP1,
Digitalpin
l = digitalRead(10); // Eingang vom Ausgang OP2,
Digitalpin
m = digitalRead(12); // Eingang vom Ausgang OP3,
Digitalpin
if(k==HIGH){ // Abfrage, ob Pin 8 auf
High
f = analogRead(19); // Zuweisung des Wertes von
Pin 19 zu f
n = f/i; // Zwischenrechnung
a = n * 3000; // Berechnung Drehzahl
//Nachricht ausgeben
lcd.setCursor(0,0); // Cursorpositionierung
Display obere Zeile
lcd.print(" Drehzahl"); // Ausgabe "Drehzahl" obere
Zeile
lcd.setCursor(0,1); // Cursorpositionierung
untere Zeile
lcd.print(a); // Ausgabe Drehzahl untere
Zeile
lcd.setCursor(6,1); // Cursorpositionierung
untere Zeile
lcd.print(" 1/min"); // Ausgabe Drehzahl untere
Zeile
if (Serial.available()){ // Abfrage, ob mit PC
verbunden
Serial.print(a); // Ausbabe der Drahzahl am
Serial Monitor
Serial.println(";"); // Ausbabe der Drahzahl am
Serial Monitor
}
delay(2000); // Verzögerung um 2 Sekunden
}
else if (l==HIGH){ // Abfrage, ob Pin 10 auf
High
g = analogRead(24); // Zuweisung des Wertes von
Pin 24 zu g
o = g/i; // zwischenrechnung
b = o * 1000; // Berechnung Drehzahl
//Nachricht ausgeben
lcd.setCursor(0,0); // Cursorpositionierung
Display obere Zeile
lcd.print(" Drehzahl"); // Ausgabe "Drehzahl" obere
Zeile
lcd.setCursor(0,1); // Cursorpositionierung
untere Zeile
lcd.print(b); // Ausgabe Drehzahl untere
Zeile
lcd.setCursor(6,1); // Cursorpositionierung
untere Zeile
lcd.print(" 1/min"); // Ausgabe Drehzahl untere
Zeile
if (Serial.available()){ // Abfrage, ob mit PC
verbunden
Serial.print(b); // Ausbabe der Drahzahl am
Serial Monitor
Serial.println(";"); // Ausbabe der Drahzahl am
Serial Monitor
}
delay(2000); // Verzögerung um 2 Sekunden
}
else if (m==HIGH){ // Abfrage, ob Pin 12 auf
High
h = analogRead(26); // Zuweisung des Wertes von
Pin 26
p = h/i; // Zwischenrechnung
c = p * 1000; // Berechnung Drehzahl
//Nachricht ausgeben
lcd.setCursor(0,0); // Cursorpositionierung
Display obere Zeile
lcd.print(" Drehzahl"); // Ausgabe "Drehzahl" obere
Zeile
lcd.setCursor(0,1); // Cursorpositionierung
untere Zeile
lcd.print(c); // Ausgabe Drehzahl untere
Zeile
lcd.setCursor(6,1); // Cursorpositionierung
untere Zeile
lcd.print(" 1/min"); // Ausgabe Drehzahl untere
Zeile
if (Serial.available()){ // Abfrage, ob mit PC
verbunden
Serial.print(c); // Ausbabe der Drahzahl am
Serial Monitor
Serial.println(";"); // Ausbabe der Drahzahl am
Serial Monitor
}
delay(2000); // Verzögerung um 2 Sekunden
}
}
also der Code hat eindeutig keinen Fehler, muss an deiner Schaltung liegen.
Was macht das Programm denn falsch? Willst du das Serial.available() denn wirklich so benutzen? Das prüft ja eigentlich nicht ob die Schaltung mit dem PC verbunden ist, sondern ob vom PC mindestens ein Zeichen gesendet wurde.
@Oliver Patsek (pitbull) >was es soll. schicke euch mal den programmcode für den fall, dass im >code ein fehler vorliegt. Siehe Netiquette. Lange Quelltexte gehören in den Anhang! https://www.mikrocontroller.net/articles/Netiquette#Klare_Beschreibung_des_Problems
@ falk brunner ich weiss bescheid fürs nächst mal. danke :) @hg der mikrocontroller geht in die erste if anweisung und bleibt da, obwohl der high-pegel nicht an dem zugehörigen pin anliegt. ausserdem sieht es so aus als ob das programm dann in der schleife stecken bleibt. es wird auch bei veränderung der spannung am analogpin keine spannung berechnet und ausgegeben. teste die schaltung an einer steckplatine, wo ich den high-pegel an pin 12 habe. das hzeisst, dass die maximaldrehzahl 1000 betragen muss. mir wird aber eine drehzahl im 2900 er bereich ausgegeben. es sieht für mich so aus, als würde das programm direkt in die erste if-anweisung gehen. habe an den pins, an denen ein low anliegen soll nichts verschaltet und ein pulldown widerstand drangehängt. mit dem serial.aviable bezwecke ich, dass wenn ein pc angeschlossen ist, die drehzahlen im seriellen monitor der arduino programmiersoftware ausgegeben werden, um sie speichern und mit ihnen diagramme etc. erstellen zu können.
Also. Delays gibt es nicht. vergiss die einfach. Blockieren gibt es auch nicht. Man arbeitet mit Zustandsmaschinen, die nirgendwo warten. Anstelle von warten, resp delays, verwendet man Timer interrupts, die man im Main zaehlt. Durch solches Vorgehen weiss man dann auch wo die Zeit verbraten wird, naemlich im Main, wo der code dann einfach idle durchfaellt. Und kann sich einfach anzeigen lassen in welchen Zustand gewartet wird. Einfach die Zutandsvariablen auslesen/anzeigen.
Der Parameter für analogRead() muss im Bereich von 0 bis 7 liegen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.