Arduino 32 Segment Display Counter programmieren?
Hi,
wie kann ich bei einem Arduino 32 Segment Display einen Counter programmieren der von 9 auf 0 runter geht? Ich habe mir zuerst dieses Standart BSP von `Hello World `: Das ist der Script:
/*
LiquidCrystal Library - Hello World
Demonstrates the use a 16x2 LCD display. The LiquidCrystal
library works with all LCD displays that are compatible with the
Hitachi HD44780 driver. There are many of them out there, and you
can usually tell them by the 16-pin interface.
This sketch prints "Hello World!" to the LCD
and shows the time.
The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* LCD VSS pin to ground
* LCD VCC pin to 5V
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
Library originally added 18 Apr 2008
by David A. Mellis
library modified 5 Jul 2009
by Limor Fried (http://www.ladyada.net)
example added 9 Jul 2009
by Tom Igoe
modified 22 Nov 2010
by Tom Igoe
modified 7 Nov 2016
by Arturo Guadalupi
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/LiquidCrystalHelloWorld
*/
// include the library code:
#include <LiquidCrystal.h>
// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("Motor startet in:");
}
void loop() {
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(8,2);
// print the number of seconds since reset:
lcd.print(millis() / 1000);
}
Danke im voraus :-).
1 Antwort
Also etwas Eigeninitiative muss da schon kommen.
Aber hier ist der Inhalt der Loop-Funktion dafür:
for (int i = 9; i >= 0; i--) {
lcd.setCursor(8, 2);
lcd.print(i);
}
while (true);
lg Suiram1
Ich habe jetzt es so gemacht wie du gesagt hast:
/*
LiquidCrystal Library - Hello World
Demonstrates the use a 16x2 LCD display. The LiquidCrystal
library works with all LCD displays that are compatible with the
Hitachi HD44780 driver. There are many of them out there, and you
can usually tell them by the 16-pin interface.
This sketch prints "Hello World!" to the LCD
and shows the time.
The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* LCD VSS pin to ground
* LCD VCC pin to 5V
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
Library originally added 18 Apr 2008
by David A. Mellis
library modified 5 Jul 2009
by Limor Fried (http://www.ladyada.net)
example added 9 Jul 2009
by Tom Igoe
modified 22 Nov 2010
by Tom Igoe
modified 7 Nov 2016
by Arturo Guadalupi
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/LiquidCrystalHelloWorld
*/
// include the library code:
#include <LiquidCrystal.h>
// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
delay(1000);
lcd.begin(16, 2);
}
void loop() {
delay(1000);
lcd.print(millis() / 1000);
for (int i = 9; i >= 0; i--) {
lcd.setCursor(8, 2);
lcd.print(i);
}
while (true);
}
Aber das steht jetzt nur in der ersten Zeile eine 2 und in der 2. Zeile 9.Sekment eine 0.
Woran liegt das?
Sorry, dass ich die ganze Zeit Frage :(
NILS
Sorry, dass ich die ganze Zeit Frage :(
Dafür ist diese Plattform doch da.
So müsste es eigentlich aussehen:
void setup() {
lcd.begin(16, 2);
}
void loop() {
for (int i = 9; i >= 0; i--) {
delay(1000);
lcd.setCursor(8, 2);
lcd.print(i);
}
while (true);
}
Das in der ersten Zeile kam durch lcd.print(millis() / 1000); zustande und der rest aufgrund desselben Problems wie davor.
Hi.
bei mir kam jetzt ein Error: /private/var/folders/ry/lk6vzfk924g2n4qwpsjt2fpr0000gn/T/.arduinoIDE-unsaved202461-1381-l0064e.7cyrb/HelloWorld/HelloWorld.ino: In function 'void setup()':
/private/var/folders/ry/lk6vzfk924g2n4qwpsjt2fpr0000gn/T/.arduinoIDE-unsaved202461-1381-l0064e.7cyrb/HelloWorld/HelloWorld.ino:2:2: error: 'lcd' was not declared in this scope
lcd.begin(16, 2);
^~~
/private/var/folders/ry/lk6vzfk924g2n4qwpsjt2fpr0000gn/T/.arduinoIDE-unsaved202461-1381-l0064e.7cyrb/HelloWorld/HelloWorld.ino: In function 'void loop()':
/private/var/folders/ry/lk6vzfk924g2n4qwpsjt2fpr0000gn/T/.arduinoIDE-unsaved202461-1381-l0064e.7cyrb/HelloWorld/HelloWorld.ino:9:3: error: 'lcd' was not declared in this scope
lcd.setCursor(8, 2);
^~~
exit status 1
Compilation error: 'lcd' was not declared in this scope
Ich klaube aber der lag daran das lcd nicht definiert oder so wurde? Kann dass sein? Wenn ja, wie behebt man es?
NILS
Vermutlich hast du nur den Code genommen den ich gerade gepostet habe...
Das war allerdings nur für die setup und loop Methode, der Rest war schon richtig.
#include <LiquidCrystal.h>
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
lcd.begin(16, 2);
}
void loop() {
for (int i = 9; i >= 0; i--) {
lcd.setCursor(8, 2);
lcd.print(i);
delay(1000);
}
while (true);
}
Hier ist noch mal der abgeänderte Code vom Anfang auf das wesentliche beschränkt (Kommentare hab ich alle rausgelöscht).
Um generell mit dem Arduino zu Arbeiten solltest du die Programmiersprache C/C++ lernen da das alles hier C/C++ wenn auch etwas abgewandelt.
So ich habe jetzt ein neues Problem :(. Was ist an diesem Code falsch dass der Motor nicht angeht
#include <LiquidCrystal.h>
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
lcd.begin(16, 2);
pinMode(13,OUTPUT);
pinMode(13,HIGH);
}
void loop() {
lcd.print("Motor startet in!");
for (int i = 9; i >= 0; i--) {
lcd.setCursor(1, 2);
lcd.print(i);
if (i==0){
lcd.clear();
lcd.setCursor(1,2);
lcd.print("Motor ist an!");
pinMode(13,HIGH);
}
delay(1000);
}
while (true);
}
Erstmal als genereller Hinweis ist es besser das alles als Quellcode einbetten da man es so vieleinfacher lesen kann. Das kannst du so machen indem du oben rechts auf das Icon klickst so das die Optionen ausgeklappt werden, dann den Quellcode Markierst und auf das </> Symbol klickst.
Zurück zur eigentlichen Frage. Das Problem hierbei ist das pinMode nur für die generelle Einstellung input oder output genutzt wird. Um nun den Pin wirklich an oder aus zu machen musst du digitalWrite nutzen.
Eine Verbesserung hatte ich ansonsten am bestehenden Code: Das If kannst du eigentlich komplett weglassen und anschließend den Teil mit der Aktivierung des Motors nach die for-Schleife packen. Also in etwa so:
lcd.print("Motor startet in!");
for (int i = 9; i >= 0; i--) {
lcd.setCursor(1, 2);
lcd.print(i);
delay(1000);
}
lcd.clear();
lcd.setCursor(1, 2);
lcd.print("Motor ist an!");
digitalWrite(13, HIGH);
Edit: In der Setup hast du ja geschrieben pinMode(13, HIGH); was wenn man digitalWrite nutzen würde ja den Motor anmachen würde, also würde man doch keinen Unterschied sehen.
Mal ein anderer Hinweis: In der Frage hast du geschrieben das es sich um ein 32 Segment Display handelt. Es müsste sich also um ein 32x4 Display handeln und damit du diese volle Größe auch nutzen kannst musst du das der Lib auch mitteilen indem du in der Setup-Methode anstelle von lcd.begin(16, 2); lcd.begin(32, 4); schreibst.
das pinMode(13, OUTPUT); kann bleiben. pinMode wird grunsätzlich genutzt um die Einstellung von output oder Input vorzunehmen und digitalWrite wird genutzt um den Pin an oder aus zu machen. Bei digitalPin müsste dir ein Fehler ausgegeben werden da es eine solche Methode nicht gibt.
So ist es gerade:
void setup() {
lcd.begin(16, 2);
pinMode(13, OUTPUT);
pinMode(13, HIGH);
}
void loop() {
lcd.print("Motor startet in!");
for (int i = 9; i >= 0; i--) {
lcd.setCursor(1, 2);
lcd.print(i);
if (i==0){
lcd.clear();
lcd.setCursor(1,2);
lcd.print("Motor ist an!");
digitalWrite(13, HIGH);
}
delay(1000);
}
while (true);
}
void setup() {
lcd.begin(16, 2);
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
}
void loop() {
lcd.print("Motor startet in!");
for (int i = 9; i >= 0; i--) {
lcd.setCursor(1, 2);
lcd.print(i);
delay(1000);
}
lcd.clear();
lcd.setCursor(1,2);
lcd.print("Motor ist an!");
digitalWrite(13, HIGH);
while (true);
}
Änderungen:
- pinMode(13, HIGH); zu digitalWrite(13, LOW); gemacht weil 1. pinMode(13, HIGH) nicht geht und weil es sinnvoller ist den Motor (falls er aus welchem Grund auch immer an ist) aus zu schalten
- Das if entfernt und den Code Block vom if nach der For-Schleife eingefügt, weil das if unnötig ist
3.3V und 5V Pin kann man nicht deaktivieren. Wenn du einen Pin wie die 13 aktivierst dann wird dieser mit 5V versorgt.
Wie kann ich noch eine zusätzliche Stromversorgung an den Arduino machen?
Was genau meinst du damit? Willst du einfach das Arduino betreiben ohne das es an den PC angeschlossen ist?
Wenn es mit dem PC verbunden ist brauch es doch keine weitere Stromquelle.
Neben dem USB-B Anschluss ist noch ein runder Anschluss wo man ein entsprechendes Netzteil anschließen kann und man kann auch Spannung an den Vin Pin anlegen.
Worauf genau willst du den hinaus? Vllt. gibt es einen besseren weg das zu machen was du vorhast.
Mir kam das mit dem Anschieben zwar seltsam vor, allerdings wenn die LEDs ansich stark leuchten kann es an der Versorgung des Arduinos nicht liegen. Bei solchen Hardware Sachen lässt sich das nur über den Chat hier sowieso schwer feststellen wo das Problem lieht, aber meine Vermutung ist das alles richtig läuft, allerdings die 5V dem Motor zu wenig sind damit er gut läuft. Deswegen schließt man eigentlich auch kein Motor direkt an das Arduino an, weil dieser dem dann quasi die Spannung 'klauen' könnte oder es dem Motor zu wenig ist. In der Regel würde man ein Motorcontroller wie z.B. einen L293D IC verwenden der an eine Eigene Spannung quelle angeschlossen ist.
Ergänzung Meinerseits: Ich hab in dem Körper der for-Schleife delay(1000); vergessen. Ohne das wird es so schnell angezeigt das man nichts erkennen kann.
Sorry, aber ich bin erst sehr neu in diesem Thema :-) . Aber noch eine Frage: Was soll ich in den setup Teil schreiben, weil wenn ich nur das was du mir geschrieben hast in den Loop teil mache und den Rest so lasse (ich habe erst den Loop Inhalt gelöscht und dann deinen eingefügt) dann steht auf dem Display die ganze Zeit 0 also in der 2. Zeile.
Woran liegt das?
LG
Nils