Hallo, und danke für die weiteren Antworten.
agmue:
int Ladung = 13;
int Knopf = 12;
int Bremse = 11;
int Rot = 3;
int Gruen = 2;
int Zuendung = 1;
int Start = 0;
Für den UNO gilt: Pin 13 als Eingang ist unglücklich und Pin 0 und 1 gehören USB. Wenn Du eine andere Hardware nutzt, kann es anders sein.
Ich habe ein Gleichheitszeichen vergessen: "eine Kombination aus Schrittkette (= endlicher Automat = finite state machine)"
Unterschiedliche Bezeichnungen für dieselbe Sache.
In einem anderen Thema findest Du ein [Beispiel](https://forum.arduino.cc/index.php?topic=620652.msg4210768#msg4210768) mit switch (schritt) als Schrittkette.
Die genaue pin Belegung kann ich ja noch ändern. Danke für den Link.
beeblebrox:
So wie ich das sehe fangen deine Probleme schon mit der Spannungsversorgung an.
Deinen Arduino direkt an das 12V Boardnetz zu hängen wird ohne weiter Maßnahmen einen
Absturz nach dem Selben erzeugen. Und damit dann "vitale" Systeme schalten ......
Du solltest schon mal über "fail save" Verhalten nachdenken.
Ok, wenn du vorm Baum hängst ist das auch eine Art von "fail save".
Ulli
Ja irgend ein Fail Save werde ich mit hinein nehmen. Ich bin am überlegen z.B. die Zündung über ein selbst tragendes Relais zu machen und die zündung über ein öffner relai dann wieder aus zu Schalten, das lässt sich ja alles ändern sobald ich erst mal die Grund Programierung habe.
Und ich wollte den Arduino nicht direckt auf 12V Bordspannung legen, da ja eh von der Lichtmaschine bis zu 15 Volt geliefert werden. Es wird auf jeden fall ein DC/DC Step Up und Step Down davor gemacht, Zusätzlich ein Condensator um eventuelle Spannungsspitzen ab zu fangen.
agmue:
Als Einstieg in die Schrittkette:
#include <CombieTimer.h> // Quelle: https://forum.arduino.cc/index.php?topic=542332.msg3716132#msg3716132
using Combie:
:EntprellTimer;
EntprellTimer entprellenLadung(30);
EntprellTimer entprellenKnopf(30);
EntprellTimer entprellenBremse(30);
const byte Ladung = 2;
const byte Knopf = 3;
const byte Bremse = 4;
const byte Rot = 9;
const byte Gruen = 10;
const byte Zuendung = 11;
const byte Start = 12;
uint32_t jetzt, vorhin;
const uint32_t drueckzeit = 3000;
byte schritt;
bool aktLadung, altLadung, aktKnopf, altKnopf, aktBremse, altBremse, einmal;
enum {WARTEN, ROT, ZEIT, GRUEN};
void setup() {
pinMode(Ladung, INPUT_PULLUP);
pinMode(Knopf, INPUT_PULLUP);
pinMode(Bremse, INPUT_PULLUP);
pinMode(Rot, OUTPUT);
pinMode(Gruen, OUTPUT);
pinMode(Zuendung, OUTPUT);
pinMode(Start, OUTPUT);
}
void loop()
{
jetzt = millis();
altLadung = aktLadung;
aktLadung = entprellenLadung(!digitalRead(Ladung)); // invers, wg. pullup
altKnopf = aktKnopf;
aktKnopf = entprellenKnopf(!digitalRead(Knopf)); // invers, wg. pullup
altBremse = aktBremse;
aktBremse = entprellenBremse(!digitalRead(Bremse)); // invers, wg. pullup
switch (schritt)
{
case WARTEN:
if (einmal) {
einmal = false;
digitalWrite(Rot, LOW);
digitalWrite(Gruen, LOW);
digitalWrite(Zuendung, LOW);
digitalWrite(Start, LOW);
}
if (aktBremse)
{
if (!altKnopf && aktKnopf)
{
einmal = true;
schritt = ZEIT;
}
} else {
if (!altKnopf && aktKnopf)
{
einmal = true;
schritt = ROT;
}
}
break;
case ROT:
if (einmal) {
einmal = false;
digitalWrite(Rot, HIGH);
digitalWrite(Gruen, LOW);
digitalWrite(Zuendung, HIGH);
}
if (!altKnopf && aktKnopf)
{
einmal = true;
schritt = WARTEN;
}
break;
case ZEIT:
if (einmal) {
einmal = false;
digitalWrite(Rot, HIGH);
digitalWrite(Gruen, LOW);
digitalWrite(Zuendung, HIGH);
vorhin = jetzt;
}
if (!aktKnopf)
{
einmal = true;
schritt = WARTEN;
}
if (jetzt - vorhin >= drueckzeit)
{
einmal = true;
schritt = GRUEN;
}
break;
case GRUEN:
if (einmal) {
einmal = false;
digitalWrite(Rot, LOW);
digitalWrite(Gruen, HIGH);
digitalWrite(Zuendung, HIGH);
digitalWrite(Start, HIGH);
}
if (!aktKnopf)
{
einmal = true;
schritt = WARTEN;
}
break;
}
}
Wenn man CombieTimer zum Entprellen nimmt, kann man die Bibliuothek auch gleich für die Verzögerung verwenden:
Combie:
:SimpleTimer timer; // timer Instanz anlegen
using Combie:
:EntprellTimer;
EntprellTimer entprellenLadung(30);
EntprellTimer entprellenKnopf(30);
EntprellTimer entprellenBremse(30);
const byte Ladung = 2;
const byte Knopf = 3;
const byte Bremse = 4;
const byte Rot = 9;
const byte Gruen = 10;
const byte Zuendung = 11;
const byte Start = 12;
const uint32_t drueckzeit = 3000;
byte schritt;
bool aktLadung, altLadung, aktKnopf, altKnopf, aktBremse, altBremse, einmal;
enum {WARTEN, ROT, ZEIT, GRUEN};
void setup() {
pinMode(Ladung, INPUT_PULLUP);
pinMode(Knopf, INPUT_PULLUP);
pinMode(Bremse, INPUT_PULLUP);
pinMode(Rot, OUTPUT);
pinMode(Gruen, OUTPUT);
pinMode(Zuendung, OUTPUT);
pinMode(Start, OUTPUT);
}
void loop()
{
altLadung = aktLadung;
aktLadung = entprellenLadung(!digitalRead(Ladung)); // invers, wg. pullup
altKnopf = aktKnopf;
aktKnopf = entprellenKnopf(!digitalRead(Knopf)); // invers, wg. pullup
altBremse = aktBremse;
aktBremse = entprellenBremse(!digitalRead(Bremse)); // invers, wg. pullup
switch (schritt)
{
case WARTEN:
if (einmal) {
einmal = false;
digitalWrite(Rot, LOW);
digitalWrite(Gruen, LOW);
digitalWrite(Zuendung, LOW);
digitalWrite(Start, LOW);
}
if (aktBremse)
{
if (!altKnopf && aktKnopf)
{
einmal = true;
schritt = ZEIT;
}
} else {
if (!altKnopf && aktKnopf)
{
einmal = true;
schritt = ROT;
}
}
break;
case ROT:
if (einmal) {
einmal = false;
digitalWrite(Rot, HIGH);
digitalWrite(Gruen, LOW);
digitalWrite(Zuendung, HIGH);
}
if (!altKnopf && aktKnopf)
{
einmal = true;
schritt = WARTEN;
}
break;
case ZEIT:
if (einmal) {
einmal = false;
digitalWrite(Rot, HIGH);
digitalWrite(Gruen, LOW);
digitalWrite(Zuendung, HIGH);
timer.start();
}
if (!aktKnopf)
{
einmal = true;
schritt = WARTEN;
}
if (timer(drueckzeit))
{
einmal = true;
schritt = GRUEN;
}
break;
case GRUEN:
if (einmal) {
einmal = false;
digitalWrite(Rot, LOW);
digitalWrite(Gruen, HIGH);
digitalWrite(Zuendung, HIGH);
digitalWrite(Start, HIGH);
}
if (!aktKnopf)
{
einmal = true;
schritt = WARTEN;
}
break;
}
}
Was ist denn jetzt ´´entprellen´´? und wieso ´´byte´´? Also zum teil verstehe ich den Code ja aber der rest sagt mir nur Bahnhof. Sorry das ich so etwas machen will obwohl ich ein totaler Anfänger bin, und nicht mal irgend eine Programmiersprache kann.