bin gerade am erlernen der Basics mit Sketch und stehe am Anfang. Habe ein kleines Sketch Program geschrieben aber es macht nicht das was ich gerne hätte.
Ich möchte mit zwei Tastern vor und zurück zählen und dabei in bestimmten Bereichen aufhalten. z.B zwischen 0-3. Danach möchte die Zählvariable, auf verschiedenen Ausgängen schalten. Zunächst sollen es einfache LED's sein und später Relais. Ich habe schon gelesen dass man bei Relais mit millis arbeitet aber dafür ist es noch zu früh für mich.
Leider habe ich keinen realen Arduino zum testen und nutze leider nur einen Webbasierten Arduino von thinkercad.com.
Vielen Dank für eure Zeit!
Hier einmal das script:
int Schalter_rauf;
int Schalter_runter;
int EingangA = 2;
int EingangB = 3;
int AusgangA = 10;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(EingangA,INPUT);
pinMode(EingangB,INPUT);
pinMode(AusgangA,OUTPUT);
}
void loop() {
Schalter_rauf = digitalRead(EingangA);
Schalter_runter = digitalRead(EingangB);
int CNT=0;
while (CNT < 3) {
if (Schalter_rauf == 1)
{ CNT=CNT+1;}
if (Schalter_runter == 0)
{CNT=CNT-1;}}
if (CNT==3)
{digitalWrite(AusgangA,HIGH);
}
}
Während der while-Schleife werden die Schalter nicht eingelesen.
Wie wäre es dann richtig? wenn ich digitalread() in der While Schleife einfüge ändert sich leider nichts.
void loop() {
// put your main code here, to run repeatedly:
int CNT=0;
while (CNT< 5) {
Schalter_rauf = digitalRead(EingangA);
Schalter_runter = digitalRead(EingangB);
if (Schalter_rauf == 1)
{ CNT=CNT+1;}
if (Schalter_runter == 0){
CNT=CNT-1;}}
if (CNT==1) {
digitalWrite(AusgangA,HIGH);
}
}
Arduino kompatible Boards, sind für wenige Euronen, zu erwerben.
ich weiß aber hier in Cebu City komme ich an keine Controller ran, da überall Straßensperren aufgestellt sind und man darf leider nicht raus.
:o Wenn du dir erst das falsche angewöhnt hast, dann ist es zu spät für dich. :o
Aber millis() auszublenden, wenn man ein Zeitverhalten benötigt, ist eher kontraproduktiv.
Hast ja mehr Zeit, als Arduinos.....
Ein guter Suchtipp: "Endlicher Automat"
Denn da läuft Arduino Programmierung meistens drauf hinaus!
Auch du willst offensichtlich einen Automaten bauen.
(selbst wenn dir das jetzt noch nicht klar ist)
Deine ersten Gehversuche in allen Ehren, aber so wird das nichts werden. Du musst schon was zum üben und testen haben.
auf die while schleife kannst du verzichten dazu gibts loop
die Variable CTN würde ich dann global definieren, nicht im Loop da wird sie immer wieder auf 0 gesetzt
die Taster solltest Du irgendwie entprellen das kann man erst mal mit einem delay im loop machen
-die Variable CTN soll ja nur geändert werden wenn der Taster gerade gedrückt wurde und nicht wärend der gesamten Zeit. Stichwort Flankenerkennung
damit du sehen kannst ob das auch klappt sollte man einen Ausgabe auf dem Monitor machen.
Du solltes wissen wie man den Taster anschliesst. Damit der Eingang bei einem offenem Schalter nicht in der Luft hängt und irgendwas erkennt , benötigst Du eine Pullup oder pulldown Widerstand. Am einfachsten geht das wenn der Taster zwischen dem Pin und GND angschlossen wird dann kannst Du den internen Pullup einschalten. Damit ist der Eingang bei offenem Schalter H und bei geschlossenen L . Die Logik kann man beim Einlesen des Schalters wieder umdrehen (invertieren).
Um dir mal auf die Sprünge zu helfen hab ich mal was für Dich gemacht um hoch zu zählen, runter ist dann erst mal Deine Aufgabe.
Aber wie bereits gesagt du musst was zum probieren haben sonst bringt das nichts (kleines Starter-Kit). Amazon bringts nach Hause.
Heinz
const byte pinTaster = 3;
int counter;
bool merkerTaster, statusTaster;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(pinTaster, INPUT_PULLUP);// taster schaltet gegen GND
}
void loop() {
// put your main code here, to run repeatedly:
statusTaster = !digitalRead(pinTaster);// Eingang einlesen und invertieren
delay(10);// zum entprellen
if (statusTaster & !merkerTaster) { // Flanke erkennen
merkerTaster = true; // Merker setzten
counter ++;
Serial.println (counter);
}
if (!statusTaster) {
merkerTaster = false; // reste Merker
}
}
Ich werde mir es morgen anschauen und Rückmeldung geben.
kurze Frage! Wie ist "bool" standardmäßig eingestellt? Auf Pullup oder Pulldown habe ich in der Schaltung geachtet!
Am Starterkit komme ich erstmal leider nicht ran und solange versuche mich an der Softwarelösung(leider). Bin gerade nicht in Europa und sowas wie Amazon, Shopee, Aliexpress usw. liefert nicht da hier alles geschlossen ist. Auf den Philippinen werden im Kampf gegen Corona andere Geschütze aufgefahren als in Europa. Die Millionenstadt gleicht einer Geisterstadt wo das Militär auf den Straßen patrouilliert.
Könnt ihr einen Tip geben wie ich jetzt den Bereich zum Beispiel zwischen 0-6 einschränke? Er darf nicht weiter als 6 Zählen egal wie oft ich den Plustaster betätige und nicht weniger als 0.
Steht "const byte" dafür das ich mehrere Informationen in einer Variablen speichern kann ohne dafür Ram zu verbrauchen?
Der Unterschied zu meinem Skript ist, dass das Program nicht weiter runter zählen kann als -1, richtig?
Hat es noch andere Nachteile?
Auszug
void loop() {
// put your main code here, to run repeatedly:
X= digitalRead (pb);
Y= digitalRead (pb1);
if (X==HIGH)
{CNT=CNT+1;
delay (200);}
if (Y==HIGH)
{CNT=CNT-1;
delay (200);
Serial.println (CNT);
}
Könnt ihr einen Tip geben wie ich jetzt den Bereich zum Beispiel zwischen 0-6 einschränke? Er darf nicht weiter als 6 Zählen egal wie oft ich den Plustaster betätige und nicht weniger als 0.
C++ bietet dir die Möglichkeit eigene Datentypen zu erfinden!
Also auch einen, welcher deinen Anforderungen gehorcht.
Steht "const byte" dafür das ich mehrere Informationen in einer Variablen speichern kann ohne dafür Ram zu verbrauchen?
byte ist ein Datentype!
Meist 8 Bit breit
Und const ein Modifizierer welche das so definierte zum "Read Only" macht
Vielen Dank für eure Hilfe und den links! Ich muss mich weiter mit der Thematik noch beschäftigen und viel lernen. Aber das was ich erst einmal wollte hat geklappt.