Forum: Mikrocontroller und Digitale Elektronik probleme im programmcode für arduino nano


von Oliver P. (pitbull)


Lesenswert?

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

    }
}

von Absolvent (Gast)


Lesenswert?

also der Code hat eindeutig keinen Fehler, muss an deiner Schaltung 
liegen.

von HG (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@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

von Oliver P. (pitbull)


Lesenswert?

@ 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
von Pandur S. (jetztnicht)


Lesenswert?

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.

von Mario M. (thelonging)


Lesenswert?

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
Noch kein Account? Hier anmelden.