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.
:
Bearbeitet durch User
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.