Arduino IC2 Display zeigt beim runterzählen falsch an

Hallo zusammen,

ich bin fürchterlich neu hier und habe ein tolles Youtube Video gesehen wo es um ein Arduino gesteuerten Parkplatz geht. Das will ich nun für meinen Neffen nachbauen.

Nun habe ich mir alles gekauft und alles entsprechen angeschlossen---läuft :slight_smile:
Nun zum Problem ...

ich habe dem Sketch 12 Parkplätze zugewiesen und beim runterzählen von 10 auf 9 zeigt das Display alledings 90 an.

Also habe ich versucht mit Leerzeichen das irgendwie zu korrigieren aber das passt wohl nich.

Wer kann mir hier helfen ??

Vielen Dank im Voraus

#include <Servo.h>

#include <Wire.h>

#include <LiquidCrystal.h>

// Viral Science www.viralsciencecreativity.com www.youtube.com/c/viralscience
// Arduino Car Parking System

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);  //Change the HEX address
#include <Servo.h> 

Servo myservo1;

int IR1 = 2;
int IR2 = 4;

int Slot = 10 ;           //Enter Total number of parking Slots

int flag1 = 0;
int flag2 = 0;

void setup() {
  lcd.init();
  lcd.backlight();
pinMode(IR1, INPUT);
pinMode(IR2, INPUT);
  
myservo1.attach(3);
myservo1.write(100);

lcd.setCursor (0,0);
lcd.print(" Liams Parkplatz   ");
lcd.setCursor (0,1);
lcd.print(" 1 Euro / Stunde ");
delay (2000);
lcd.clear();  
}

void loop(){ 

if(digitalRead (IR1) == LOW && flag1==0){
if(Slot>00){flag1=1;
if(flag2==0){myservo1.write( 0); Slot =  Slot -1 ;}
}else{
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
lcd.setCursor ( 0, 0);
lcd.print("    SORRY :(    ");  
lcd.setCursor (0,1);
lcd.print(" Kein Platz mehr  "); 
delay (3000);
lcd.clear(); 
}
}

if(digitalRead (IR2) == LOW && flag2==0){flag2=1;
if(flag1==0){myservo1.write(0); Slot = Slot+1;}
}

if(flag1==1 && flag2==1){
delay (1000);
myservo1.write(100);
flag1=0, flag2=0;
}

lcd.setCursor ( 0, 0);
lcd.print("Liams Parkplatz");
lcd.setCursor (0,1);
lcd.print("noch Frei:   ");
lcd.print(  Slot  );
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
}

Bei Zahlen kleiner als 10 mußt Du ein Leerzeichen vor der Zahl drucken.

Also am Ende statt:

lcd.print(  Slot  );

das hier:

if (Slot <10)
{
lcd.print(" " );
}
lcd.print(  Slot  );

Grüße Uwe

Dazwischen eine neue Zeile:

  if (slot < 10) {lcd.print(" ");}

@uwefed war schneller :wink: - nur ne andere Schreibwesie.

Vielen Dank für die schnelle Hilfe....sehr geil

Ich werde weiter lernen und dran bleiben

Gruß Markus

Noch was zu Deiner Programmier-Aufbau.

So wie Du den Sketch schreibst ist das sehr unübersichtlich.
zB:

Da blickt man nicht durch was zur einem IF gehört und was zum anderen.

if(digitalRead (IR1) == LOW && flag1==0)
  {
  if(Slot>00)
    {
    flag1=1;
    if(flag2==0)
      {
      myservo1.write( 0); 
      Slot =  Slot -1 ;
      }
    }
    else
    {

Eine Funktion pro Zeile
Geschwungene Klammern in extra Zeile
Ein und Ausrücken bei geschwungenen Klammern. Das macht die IDE automatisch unter Werkzeuge - Automatische Formatierung STRG+T

Grüße Uwe

Ich hab Betriebsferien und sitze zuhause weil es regnet.
Da ist man einfach schneller :wink:

Ich möchte den TO anlernen, nicht alles in eine Zeile zu kleben darum scheint mir hier Deine kompakte schreibweise wenig hilfreich, auch wenn sie korrekt ist und funktioniert.
Grüße Uwe

Das geht aber mit der Grundeinstellung der formatter.conf nur manuell und ist aufwändig....

Die öffnende setze ich lieber hinter die "Ursache" der Klammerung (z.B. if, for, ...) die schießende in eine eigene Zeile.

Aber letztendlich ist die Klammersetzung weitgehend Ansichtssache, es sei denn, sie ist in Projektrichtlinien vorgegeben.

Gruß Tommy

Hi nochmals,

wie gesagt, habe ich gestern erst mit dem Thema Arduino angefangen...Hard- wie Software.
Dafür gehts ja schonmal finde ich.

So nun zur nächsten Frage meiner neuen Idee...

Die Schrank zum Parkplatz soll mit einer Duo LED ( Rot/Grün ) beleuchtet werden.
Grün für Zufahrt frei, Rot wenn kein Parkplatz mehr frei.

Ein Wenig im Sketch habe ich schon rumgezimmert und was soll ich sagen, für das geringe Wissen funktioniert es fast so wie es wollte.

Nach dem Start leuchtet die Grüne LED wie gewollt. Sobald kein Parkplatz mehr verfügbar ist und ein Fahrzeug fährt zur Schranke ( Lichtschranke ) leuchtet die rote LED und die grüne geht aus.

Fahre ich aber nun mit Auto von der Schranke weg , geht die rote aus und die grüne geht wieder an. Aber ich wollte das sobald der Arduino bemerkt das kein Platz ist auf rot schaltet und erst wieder grün wird wenn ein Auto raus gefahren ist.

Im moment sieht der Code so aus

#include <Servo.h>

#include <Wire.h>

#include <LiquidCrystal.h>

// Viral Science www.viralsciencecreativity.com www.youtube.com/c/viralscience
// Arduino Car Parking System

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);  //Change the HEX address
#include <Servo.h> 

Servo myservo1;

int IR1 = 2;
int IR2 = 4;

int Slot = 2 ;           //Enter Total number of parking Slots

int flag1 = 0;
int flag2 = 0;

void setup() {
  lcd.init();
  lcd.backlight();
pinMode(IR1, INPUT);
pinMode(IR2, INPUT);
  
myservo1.attach(3);
myservo1.write(100);

lcd.setCursor (0,0);
lcd.print(" Liams Parkplatz   ");
lcd.setCursor (0,1);
lcd.print(" 1 Euro / Stunde ");
delay (2000);
lcd.clear();  
}

void loop(){ 

if(digitalRead (IR1) == LOW && flag1==0){
if(Slot>00){flag1=1;
if(flag2==0){myservo1.write( 0); Slot =  Slot -1 ;}
}else{
lcd.setCursor ( 0, 0);
pinMode(12, OUTPUT);
digitalWrite(12, LOW);
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
lcd.print("    SORRY :(    ");  
lcd.setCursor (0,1);
lcd.print(" Kein Platz mehr  "); 
delay (3000);
lcd.clear(); 
}
}

if(digitalRead (IR2) == LOW && flag2==0){flag2=1;
if(flag1==0){myservo1.write(0); Slot = Slot+1;}
}

if(flag1==1 && flag2==1){
delay (1000);
myservo1.write(100);
flag1=0, flag2=0;
}

lcd.setCursor ( 0, 0);
lcd.print("Liams Parkplatz");
lcd.setCursor (0,1);
lcd.print("noch Frei:   ");
pinMode(12, OUTPUT);
digitalWrite(12, HIGH);
if (Slot <10)
{
lcd.print(" " );
}
lcd.print(  Slot  );
if (Slot <00);
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
}

Also dachte ich muss eine Prüfung einbauen, aber das funktioniert iwie nicht und zwar so


if (Slot >00);
pinMode(12, OUTPUT);
digitalWrite(12, HIGH);
pinMode(13, OUTPUT);
digitalWrite(13, LOW);

if (Slot <00);
pinMode(12, OUTPUT);
digitalWrite(12, LOW);
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);

Hier flackert die grüne LED und die rote leuchtet dauerhaft.

Bitte entschuldigt mein Chaos, aber wie gesagt Arduino Wissenstand jetzt knapp 1:30 Stunde.

Gruße Markus

Deine If-Abfrage führt danach keine Anweisung aus. Das Semikolon beendet.

Wenn du mehrere Anweisungen zusammenhängend ausführen willst, müssen sie in ein Block, zwischen geschweiften Klammern.

pinMode setzt man in der Regel nur einmalig im Setup. Ein wiederholtes aufrufen ist überflüssig.

Dein Beispiel angepasst

if (Slot >00) {
  digitalWrite(12, HIGH);
  digitalWrite(13, LOW);
}
if (Slot <00) {
  digitalWrite(12, LOW);
  digitalWrite(13, HIGH);
}

In Block gehörende Dinge, werden zur Lesbarkeit, um in der Regel 2 Leerzeichen, eingerückt. Einige rücken auch um 4 Leerzeichen ein. So erkennt man besser, welche Blöcke noch geöffnet sind.

STRG+T in der Arduino IDE hilft dir dabei.

Kurzer Hinweis:
Du schreibst im Code u.a.

Mach das nicht. Du suchst Dich später dusslig, wenn Du bei irgendeiner Änderung einmal eine PinAngabe überliest.
Gebe den Pins Namen:

const byte rotPin = 12;
const byte gruenPin = 13;

und ersetze mit rotPin (bzw. gruenPin) alle numerischen Angaben im Code.
Das zuweisen, was der Pin machen soll "pinMode" gehört ins Setup. Es gibt nur wenige Spezialfälle, wo man sowas immer wieder braucht.

Und hier:

ist mit dem Semikolon Ende.

Fasse zusammen was zusammengehört.
Wenn die Ampel grün wird, muss rot ausgehen, bzw. anders rum.
Mal ein wenig umgeschrieben:

#include <Servo.h>

#include <Wire.h>

#include <LiquidCrystal.h>

// Viral Science www.viralsciencecreativity.com www.youtube.com/c/viralscience
// Arduino Car Parking System

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); //Change the HEX address
#include <Servo.h>

Servo myservo1;

int IR1 = 2;
int IR2 = 4;

int Slot = 2 ;           //Enter Total number of parking Slots

int flag1 = 0;
int flag2 = 0;

const byte ampelRot = 12;
const byte ampelGruen = 13;
void setup()
{
  lcd.init();
  lcd.backlight();
  pinMode(IR1, INPUT);
  pinMode(IR2, INPUT);
  myservo1.attach(3);
  myservo1.write(100);
  lcd.setCursor (0, 0);
  lcd.print(" Liams Parkplatz   ");
  lcd.setCursor (0, 1);
  lcd.print(" 1 Euro / Stunde ");
  delay (2000);
  lcd.clear();
  pinMode (ampelGruen, OUTPUT);
  pinMode(ampelRot, OUTPUT);
}

void loop()
{
  if (digitalRead (IR1) == LOW && flag1 == 0)
  {
    if (Slot > 0)
    {
      flag1 = 1;
      if (flag2 == 0)
      {
        myservo1.write( 0);
        Slot =  Slot - 1 ;
      }
    }
    else
    {
      lcd.setCursor ( 0, 0);
      lcd.print("    SORRY :(    ");
      lcd.setCursor (0, 1);
      lcd.print(" Kein Platz mehr  ");
      delay (3000);
      lcd.clear();
    }
  }
  if (digitalRead (IR2) == LOW && flag2 == 0)
  {
    flag2 = 1;
    if (flag1 == 0)
    {
      myservo1.write(0);
      Slot = Slot + 1;
    }
  }
  if (flag1 == 1 && flag2 == 1)
  {
    delay (1000);
    myservo1.write(100);
    flag1 = 0, flag2 = 0;
  }
  lcd.setCursor ( 0, 0);
  lcd.print("Liams Parkplatz");
  lcd.setCursor (0, 1);
  lcd.print("noch Frei:   ");
  if (Slot < 10)
  {
    lcd.print(" " );
  }
  lcd.print(Slot);
  // Ampel
  if (Slot <= 00)                   // kein Slot mehr frei
  {
    digitalWrite(ampelGruen, LOW);  // keiner darf mehr rein
    digitalWrite(ampelRot, HIGH);
  }
  else
  {
    digitalWrite(ampelGruen, HIGH); // Wenn Slot verfügbar, dann frei
    digitalWrite(ampelRot, LOW);
  }
}

PS: wenn Du ganz frisch eingestiegen bist, empfehle ich mal ein wenig pdf-Literatur. Die liest sich gut und ist auf den Punkt gebracht. ArduinoForum.de - Das deutschsprachige Forum rund um den Arduino - Arduino Code-Referenz (deutsch) Da einfach runterladen und jeden Abend ein paar Seiten lesen.

Vielen Dank für die Hilfe, manchmal probiert man eben mal erst bevor man liest.
Ist doch bei neuen Technik Geräten genauso, Auspacken- Anschließen-Benutzen :slight_smile:

Probleme oder Unwissenheit wird später erlesen

Aber ich werde den Rat befolgen und habe es mir schon runtergeladen. Eigentlich macht so ein Arduino ja Spaß und mal sehen was als nächstes gebastelt wird.

Gruß Markus

Ich würde die Ampel auf Rot schalten sobald kein Stellplatz mehr frei ist, nicht erst wenn kein Stellplatz frei ist und ein weiteres Fahrzeug zur Einfahrtschranke hinfährt.
Dann hast Du nicht das Problem mit dem zu und wieder wegfahrenden Fahrzeug.
Grün wird die Ampel erst, wenn ein Stellplatz frei wird und das Fahrzeug herausgefahren ist.

Grüße Uwe