Guten Morgen
Ich wollte für mein Hobby, das Geocachen, einen richtig guten Cache machen. (Wer nicht weiss was dass ist hier ein Link: Geocaching )
Dafür habe ich an so etwas wie eine grosse Box gedacht wo man mit einem LCD-Display aufgaben bekommt und die an der Box ausführen muss. Beispiele solcher Aufgaben sind: Mit einer Tachenlampe ein Lichtsenor zum durchaltenzu brigen, die Box auf eine bestimmte höhe bringen (Ultraschall-Distanzmesser), mit einem Batch etwas öffnen und vlt noch mehr.
Ich habe mir extra für dieses Projekt einen Mega2560 gewählt da er mehr Pin-Plätze hat.
SO zu meiner Frage:
Kann ich überhaubt so viele Funktionen an einem Arduino ausführen??
Wenn Ja wie??
Ja, das wird funktionieren. Allerdings brauchst du dazu nicht unbedingt einen Mega.
Du kannst jeden Arduino mit einem Port-Expander auf eine große Anzahl von Pins erweitern.
Wichtig dabei ist, jede deiner gewählten Funktionen wird sehr schnell hintereinander abgearbeitet, wenn es dein Sketch zulässt.
challenger:
Dass das LCD-Dislay an ist und eine dass eine Funktion erfüllt werden muss so gleichzeitig.
Wenn du dir die zahlreichen Beispiele hier im Forum oder im Web ansiehst, wirst du feststellen, das ist kein Problem und funktioniert bei richtiger Programmierung immer.
Edit:
Du hast es doch in deinem letzten Thread auch gesehen.
Der US-Sensor misst eine Entfernung und zeigt diese kurz darauf im Monitor an.
Bzw. leuchtet deine Led.
Fast gleichzeitig.
challenger:
Kann ich überhaubt so viele Funktionen an einem Arduino ausführen??
ja. Kannst du.
challenger:
Wenn Ja wie??
Das hängt davon ab, was du tun willst.
Es gibt viele Möglichkeiten, Programmabläufe zu strukturieren. Z.B. über switch/case Anweisung:
byte Aufgabe = 1;
int Startknopf = 3; // Pin, an dem der Startknopf
void setup() {
// put your setup code here, to run once:
}
void loop() {
switch(Aufgabe){
case 1:
Aufgabe1();
Aufgabe = 2;
break;
case 2:
Aufgabe2();
Aufgabe = 3;
break;
case 3:
Aufgabe3();
Aufgabe = 4;
break;
case 4:
Serial.println("Alle Aufgaben gelöst!");
Aufgabe = 0;
break;
case 0:
Serial.println("START drücken um Aufgaben zu beginnen");
if (digitalRead(Startknopf) == LOW) Aufgabe = 0;
break;
}// end switch
}// end loop
void Aufgabe1(){
// hier ist der Code für Aufgabe1
}
void Aufgabe2(){
// hier ist der Code für Aufgabe2
}
void Aufgabe3(){
// hier ist der Code für Aufgabe3
}
Man kann die Aufgaben sequenziell abarbeiten lassen, oder, über irgendeine Eingabe, die Aufgaben frei wählbar machen.
Aber vor dem Programmieren steht erst mal die Überlegung: Was soll die Kiste den eigentlich genau tun?
am besten du malst oder schreibst dir Schritt für Schritt auf, was passieren soll. Zu erst auf einer höheren Ebene ("Taster abfragen; WEnn Taster X gedrückt, Aufgabe X"), dann für die einzelnen Aufgaben.
Vielen Dank aber ich glaube ich bleibe bei einer if Bedingung ;D
Jetzt bin ich schon beim programmieren hab aber jetzt ein Problem wo ich schon befürchtet habe.
Ich habe zuerst die Aufgabe das man einen Gegenstand 10cm vom Ultraschallsensor haben muss dann geht die erste LED an. Wenn die erste LED an ist kommt der Lichtsesnor ins Spiel den muss man über einen Wert 1000 bringen, schafft man wenn man eine Taschenlampe daran hält. Mein Problem ist jetzt aber dass beim "Serial Monitor" immer zwei Werte geschrieben werden. Wie kann ich bei der ersten Funktion nur den ersten Wert schreiben lassen und bei der zweiten die zweite??
Hier der Code:
#include "SR04.h"0.
#define TRIG_PIN 3
#define ECHO_PIN 2
SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);
long a;
int LED = 4;
int Wert = 0;
void setup() {
Serial.begin(9600);
delay(3000);
pinMode(LED,OUTPUT);
}
void loop() {
a=sr04.Distance();
Serial.print(a);
Serial.println("cm");
delay(3000);
if (a >= 10 && a<= 12){
digitalWrite(LED,HIGH);
}
if (LED = HIGH) { // ab hier kommt der Lichtsensor ins Spiel
pinMode
Wert = analogRead(A0);
Serial.println(Wert);
delay(15);
if(Wert>1000){
digitalWrite(5,HIGH);
delay(100);
}
if(Wert<1000){
digitalWrite(5,LOW);
delay(100);}
}
}
Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:
Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay,
Ich habe jeden Link angeklickt und durchgelesen, verstanden habe ich aber nur wenig... :-[ Besser gesagt das mit dem taskBegin und taskEnd hat recht vielversprechen geklungen hab es aber wahrscheinlich am falschen Ort eingesetzt daher hat sich nichts getan.....
Sorry hab die Frage falsch verstande :-[
Der letzte Komentar von mir ist falsch.
Die Antwort jetzt:
Ich habe einfach der taskBegin-Befehl bei der ersten Funktion gemacht.(Ultraschall-Distanz)
und wenn man die Funktion erfüllt hat den taskEnd-Befehl.
Danach geht es weiter mit der nächsten Funktion und ich habe das gleiche gemacht am Anfang und am Ende.:
#include "SR04.h"0.
#include <TaskMacro.h>
#define TRIG_PIN 3
#define ECHO_PIN 2
SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);
long a;
int LED = 4;
int Wert = 0;
void setup() {
Serial.begin(9600);
delay(3000);
pinMode(LED,OUTPUT);
}
void loop() {
taskBegin()
a=sr04.Distance();
Serial.print(a);
Serial.println("cm");
delay(3000);
if (a >= 10 && a<= 12){
digitalWrite(LED,HIGH);
}
taskEnd()
if (LED = HIGH) { // ab hier kommt der Lichtsensor ins Spiel
taskBegin()
Wert = analogRead(A0);
Serial.println(Wert);
delay(15);
if(Wert>1000){
digitalWrite(5,HIGH);
delay(100);
}
if(Wert<1000){
digitalWrite(5,LOW);
delay(100);}
taskEnd()
}
}
Ich habe einfach der taskBegin-Befehl bei der ersten Funktion gemacht.(Ultraschall-Distanz)
und wenn man die Funktion erfüllt hat den taskEnd-Befehl.
taskBegin und taskEnd dürfen jeweils nur einmal pro Funktion auftauchen.
Nicht mehrmals, so wie bei dir.
Bitte verwende nicht den Begriff Funktion für die falschen Zwecke.
loop() ist eine Funktion.
Und innerhalb dieser Funktion gibt es bestenfalls Blöcke, oder Funktionsaufrufe, aber keine weiteren Funktionen.
Deine Verwendung des Begriffes Funktion führt dich in die Irre.
Ich bevorzuge eine Endlosschleife zwischen taskBegin und taskEnd
So wird es auch bei vollwertigen Multitaskingsystemen abgehandelt.
Hat also einen gewissen Wiedererkennungswert.
Auch brauchst du bei der Verwendung der TasMakros keine Delays mehr.
Diese werden durch TaskPause ersetzt.
Denn Delay blockiert das ganze System.
TaskPause lässt die Verarbeitung anderer Dinge zu.