hi Leute,
ich Sitze seit einigen Stunden an einem Sketch für eine etwas größeres Projekt. Das Projekt ist noch lange nicht Fertig also bitte nicht wundern wegen des unaufgeräumten Sketches. Wenn ich im Loop() die Funk. checkDistance() ausführe funktioniert der Ultraschallsensor perfekt. Jetzt habe ich aber noch eine kleine Statemaschine mit eingebaut. Ich frage also im Loop() den State ab.. In der Funk. state_action() setz ich den State. Wenn system_State = 2 ist soll er die Entfernung messen und einen Motor bis zu einem bestimmten punkt fahren. Wo ist mein Denkfehler "Es liegt ziemlich sicher an den States". Weil ohne geht`s Ja.
Danke für die Hilfe <3
Upps Sketch vergessen
#include <Arduino.h>
const int echo1 = 6;
const int trigger1 = 7;
const int indicator_RED1 = 2;
const int indicator_GREEN1 = 3;
const int indicator_Yellow1 = 4;
const int SystemLED = 13;
unsigned long t_0_L1 = 0;
const int d[6] = {550, 300, 450, 500, 600, 400};
int stateBlinkLED;
int prev_stateBlinkLED;
int serial_millis;
//Ultraschall
unsigned long time = 0;
unsigned long distance = 0;
unsigned long previous_Millis = 0;
const int delay_ON_Time = 1;
const int delay_Serial;
int state_Print = LOW;
int trigger_State = LOW;
int statedistance = 0;
//0 = Standby; 1 = Start Sequenz; 2 = Distance messen; 3 = Error;
int state_System = 0;
unsigned long previous_State_Millis = 0;
const int delay_Startup = 3000;
void checkDistance(){
unsigned long current_Millis = millis();
if(current_Millis - previous_Millis >= delay_ON_Time){
previous_Millis = current_Millis;
if(trigger_State == LOW){
trigger_State = HIGH;
}else{
trigger_State = LOW;
}
}
if(current_Millis - previous_Millis >= delay_Serial){
previous_Millis = current_Millis;
if(state_Print == LOW){
state_Print = HIGH;
}else{
state_Print = LOW;
}
}
digitalWrite(trigger1, trigger_State);
int duration, distance;
duration = pulseIn(echo1, HIGH);
distance = (duration/2) / 29.1;
if(state_Print == HIGH){
if(distance <= 500 || distance >= 0){
Serial.print(distance);
Serial.println("cm");
}else{
Serial.print("Kein Messwert");
state_System = 3;
}
}
}
void indicator_LED(){
if(distance >= 500 || distance <= 0){
Serial.println("Kein Messwert");
}else if(distance <= 10){
digitalWrite(indicator_RED1, HIGH);
digitalWrite(indicator_GREEN1, LOW);
digitalWrite(indicator_Yellow1, LOW);
}else if(distance <=20){
digitalWrite(indicator_RED1, LOW);
digitalWrite(indicator_GREEN1, LOW);
digitalWrite(indicator_Yellow1, HIGH);
}else if(distance >=20){
digitalWrite(indicator_RED1, LOW);
digitalWrite(indicator_GREEN1, LOW);
digitalWrite(indicator_Yellow1, HIGH);
}
}
void blinkSystemLED(){
prev_stateBlinkLED = stateBlinkLED;
switch (stateBlinkLED) {
case 0: // Reset
t_0_L1 = millis();
stateBlinkLED = 1;
break;
case 1://Blink
if(millis() - t_0_L1 >= d[0]){
digitalWrite(SystemLED, LOW);
stateBlinkLED = 2;
t_0_L1 = millis();
}else{
digitalWrite(SystemLED, HIGH);
}
break;
case 2://Blink
if(millis() - t_0_L1 >= d[1]){
digitalWrite(SystemLED, LOW);
stateBlinkLED = 3;
t_0_L1 = millis();
}else{
digitalWrite(SystemLED, LOW);
}
break;
case 3://Blink
if(millis() - t_0_L1 >= d[2]){
digitalWrite(SystemLED, LOW);
stateBlinkLED = 4;
t_0_L1 = millis();
}else{
digitalWrite(SystemLED, HIGH);
}
break;
case 4:
if(millis() - t_0_L1 >= d[3]){
digitalWrite(SystemLED, LOW);
stateBlinkLED = 5;
t_0_L1 = millis();
}else{
digitalWrite(SystemLED, LOW);
}
break;
case 5:
if(millis() - t_0_L1 >= d[4]){
digitalWrite(SystemLED, LOW);
stateBlinkLED = 6;
t_0_L1 = millis();
}else{
digitalWrite(SystemLED, HIGH);
}
break;
case 6://BLINK and GO case 0;
if(millis() - t_0_L1 >= d[5]){
digitalWrite(SystemLED, LOW);
stateBlinkLED = 0;
t_0_L1 = millis();
}else{
digitalWrite(SystemLED, LOW);
}
break;
}
}
void state_action(){
if(state_System == 1){
if(millis() - previous_State_Millis >= delay_Startup){
state_System = 2;
}else{
state_System = 1;
Serial.println("Start...");
}
}else if(state_System == 0){
//Standby
}else if(state_System == 2){
}
}
void setup() {
state_System = 1;
statedistance = 0;
Serial.begin(9600);
pinMode(SystemLED, OUTPUT);
pinMode(indicator_RED1, OUTPUT);
pinMode(indicator_GREEN1, OUTPUT);
pinMode(indicator_Yellow1, OUTPUT);
pinMode(trigger1, OUTPUT);
pinMode(echo1, INPUT);
stateBlinkLED = 0;
}
void loop() {
blinkSystemLED();
state_action();
if(state_System == 0){
state_System = 1;
}else if(state_System == 1){
}else if(state_System == 2) {
checkDistance();
}else if(state_System == 3) {
}
}
Ich habe eben in dem Setup() den State auf 0 gestellt und dort klappt es auch.. Nur in state 2 nicht..
noiasca
February 20, 2020, 7:21pm
4
beschreibe kurz was deine Funktionen so machen soll.
z.B. die:
void state_action() {
was ich dir aber gleich an Tipp mitgeben kann:
statte deinen Sketch mit Serial.println Debug-Ausgaben aus und beobachte was dein Sketch macht.
da du nur in state_System == 2 dein checkDistance machst wirds wohl so sein, dass du nie in den State kommst oder diesen zu schnell verlässt.
was muss erfüllt sein um dieses IF wahr werden zu lassen:
if (millis() - previous_State_Millis >= delay_Startup) {
kommst da rein?