PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : brauche Hilfe für den einfachsten Sketch



xxrider
09.02.2018, 21:39
ach, bin Anfänger und ich übe einfach zu wenig ...
daher hänge ich an folgendem, heruntergebrochenem Easy-Sketch, der nicht die LEDs ändern will.
Es ist ein Digispark Attiny85.
Warum mag der nicht?


const int M1=4; //Noise Modul 1 auf 4
const int M2=5; // Noise Modul 2 auf 5
const int buzz=0; // Buzzer auf 0
const int green =1; //LED Grün auf 1
const int yellow =2; //LED Gelb auf 2
const int red=3; //LED Rot auf 3


void setup() {


pinMode(buzz, OUTPUT); //Buzzer
pinMode(green, OUTPUT); // Green LED
pinMode(yellow, OUTPUT); //Yellow LED
pinMode(red, OUTPUT); // red LED
pinMode(M1, INPUT); //Noise Modul1
pinMode(M2, INPUT); //Noise Modul2

}
// the loop routine runs over and over again forever:

void loop() {

int schwelle1= digitalRead(M1);

int schwelle2= digitalRead(M2);



if (schwelle1=0){

digitalWrite(green, HIGH);


}

if (schwelle1=1) {


digitalWrite(green, LOW);


}
}

witkatz
09.02.2018, 22:01
if (schwelle1=0){

if (schwelle1=1) {

Wenn das Vergleiche sein sollen, dann solltest du den Vergleichsoperator == nutzen. = ist in C++ ein Zuweisungsoperator. Es ist ein beliebter Fallstrick in C, C++ und Java und ein gescheiter Compiler gibt eine Warnung aus bei Benutzung von = in der if-Anweisung.

xxrider
09.02.2018, 22:49
ah, wird gleich probiert, danke!

- - - Aktualisiert - - -

o.k., also ich glaube das war auf alle Fälle ein Fehler.
Aber funktionieren tuts trotzdem noch nicht ganz. Wenn ich P0 als Eingang proigrammiere und P1 als LED Ausgang (da ist auch eine interne LED dran), dann geht es.
Wenn ich statt P0 Eingang den Eingang auf P5 programmiere, dann geht die LED mit einer Zeitverzögerung von ca. 3 Sekunden an und bei änderung des Eingangssignal sofort aus.
(Zum Testen ziehe ich den Eingang entweder auf 5V oder auf gnd).
Was kann da sein?

i_make_it
10.02.2018, 06:36
Mein erstes Arduino Programm sah ähnlich aus (Fußgänger Ampel).
Ich hatte im Define Teil keine "const" drin.

Und ich habe durchgängig nur "HIGH" und "LOW" benutzt und keine "0" und "1".
Als erste Maßnahme kann man mal prüfen welche Werte den "schwelle1" und 2 annehmen.
Also eine Serielle Übertragung starten und nach der übernahme durch digitalRead mit Serial.print ausgeben und mit dem seriellen Monitor beobachten.

Denn bis auf die Zuweisung statt des Vergleichs erscheint der Code OK zu sein.
Und im dem Fall macht er ja was er soll.
Die Konzequenz daraus wäre, daß das was er macht zwar richtig ist, aber nicht das was Du erwartest.
Und da bleiben nur die beiden Variablen, die als einziges Zustandsänderungen verursachen können.
Alo mal nachsehen was die für Werte haben.

Beispiel für eine serielle Ausgabe in Deinem Code


void setup() {
Serial.begin(9600); <<<< Serielle Ausgabe starten
.
.
.
}



void loop() {
int schwelle1 = digitalRead(M1);
int schwelle2 = digitalRead(M2);

Serial.print(schwelle1); <<<< Wert ausgeben
Serial.println(schwelle2); <<<< Wert ausgeben und Zeilenumbruch

if (schwelle1 == 0){
.
.
.
.
.
}

Hier habe ich mal meinen Code drangehängt. der funktioniert so auf einem Arduino Nano.


int f_tast = 2;
int a_rot = 3;
int a_gelb = 4;
int a_gruen = 5;
int f_rot = 8;
int f_gruen = 9;
int f_lamp_tast = 13;
int s_licht = A0;
byte f_press = HIGH;

void setup() {
pinMode(f_tast, INPUT);
pinMode(a_rot, OUTPUT);
pinMode(a_gelb, OUTPUT);
pinMode(a_gruen, OUTPUT);
pinMode(f_rot, OUTPUT);
pinMode(f_gruen, OUTPUT);
attachInterrupt(0, button, LOW);
//Serial.begin(9600);
}

void loop() {
int sensorValue = analogRead(s_licht);
//Serial.println(sensorValue);
// Blinker code zum Prüfen ob Programm läuft
digitalWrite(f_lamp_tast, HIGH); //Blinker an Taste fuer Fussgaenger
delay(500);
digitalWrite(f_lamp_tast, LOW);
delay(500);

if (sensorValue > 500){ //Dämmerungswert für Nachtschaltung
digitalWrite(a_rot, LOW);
digitalWrite(a_gelb, HIGH); //Autos Gelb für Blinker
digitalWrite(a_gruen, LOW);
digitalWrite(f_rot, LOW);
digitalWrite(f_gruen, LOW);
delay(500);
digitalWrite(a_gelb, LOW);
}
else {
digitalWrite(a_rot, LOW);
digitalWrite(a_gelb, LOW);
digitalWrite(a_gruen, HIGH); //Autos gruen
digitalWrite(f_rot, HIGH); //Fussgaenger rot
digitalWrite(f_gruen, LOW);
}

// if (digitalRead(f_tast) == LOW){ //Taste Fussgaenger abfragen
if (f_press == LOW){ //Statusvariable Taste Fussgaenger abfragen
delay(500);
digitalWrite(13, HIGH); //Taste Fussgaenger ist gedrueckt worden
digitalWrite(f_rot, HIGH); //Fussgaenger rot
digitalWrite(a_gruen, LOW);
digitalWrite(a_gelb, HIGH); //Autos gelb
delay(1000); // Autos Gelbphase
digitalWrite(a_gelb, LOW);
digitalWrite(a_rot, HIGH); //Autos rot
delay(1000); // Fussgaenger Wartezeit damit kein Auto mehr fährt
digitalWrite(13, LOW);
digitalWrite(f_rot, LOW);
digitalWrite(f_gruen, HIGH); //Fussgaenger gruen
delay (6000); //Fussgaenger gruenphase
digitalWrite(f_rot, HIGH); //Fussgaenger rot
digitalWrite(f_gruen, LOW);
delay(1000); //Autos Wartezeit damit kein Fussgaenger mehr laeuft
digitalWrite(a_gelb, HIGH); //Autos gelb
delay(1000); // Autos Gelbphase
f_press = HIGH;
}
}
void button(){
f_press = LOW;
}

xxrider
10.02.2018, 08:27
Danke, dass du mich hier unterstützt!
Das Projekt soll eine Lärmampel für meine Kinder werden, die 3 Lärmpegel-Abstufugen unterscheiden kann.
Bei zu lange auf rot, soll ein Buzzer ertönen. Ich denke, wenn ich das Grundsätzliche geklärt habe, dann könnte es auch mit dem Gesamten klappen.

aber nun erstmal für mich neu:serielle Übertragung.
Wie ich das auf einfache Weise machen machen kann, da muss ich erstmal bisschen recherchieren.
Aber der Weg ist gut, ich muss das transparent machen, das Handwerkszeug wird mir auch für weitere Projekte wichtig sein.
So irgendwie unsicher bin ich ja darin, ob die ports wirklich alle funktionieren, aber nach Datenblatt müssten ja alle Ports P0-P5 universell als Analog in / Digital in / Out definierbar sein. Aber komischweis gibt es ja Unterschiede, wenn ich die Ports tausche...
Grüße



Mein erstes Arduino Programm sah ähnlich aus (Fußgänger Ampel).
Ich hatte im Define Teil keine "const" drin.

Und ich habe durchgängig nur "HIGH" und "LOW" benutzt und keine "0" und "1".
Als erste Maßnahme kann man mal prüfen welche Werte den "schwelle1" und 2 annehmen.
Also eine Serielle Übertragung starten und nach der übernahme durch digitalRead mit Serial.print ausgeben und mit dem seriellen Monitor beobachten.

Denn bis auf die Zuweisung statt des Vergleichs erscheint der Code OK zu sein.
Und im dem Fall macht er ja was er soll.
Die Konzequenz daraus wäre daß das was er macht zwar richtig ist aber nicht das was Du erwartest.
Und da bleiben nur die beiden Variablen, die als einziges Zustandsänderungen verursachen können.
Alo mal nachsehen was die für Werte haben.

- - - Aktualisiert - - -

Es hat sich jetzt ein Ergebnis herausgestellt (serielle Auslesung war mich jetzt zunächst zu kompliziert, habe etwas anderes experimentiert, und auch vorsichtshalber das board gewechselt):

(- als LED zum Nachweis habe ich die "onboard" benutzt(=P1))
- alle restlichen Ports funktionieren korrekt als input, außer Port5. Dieser verhält sich komisch: 1. invers zu den anderen und 2. zeitverzögert
Also: seltsam, und nachteilig, dass ich wohl mit Port 5 mein Projekt begonnen habe :(
Schaun wir mal ob ich P5 als etwas anderes verwenden kann, denn ich benötige wie ich das sehe ALLE 6!


Update:
P5 ist bei den China-Clones wohl ein RESET pin, nicht ohne weiteres nutzbar...
schade...