Brauche Hilfe mit dem Programm

Hallo,

Ich habe mir eine Schaltung programmiert damit ich eine Relais-schaltung schalten kann über eine app.
nun komme ich aber nicht weiter mit dem programmieren.
Ich will gerne das wenn ich den Arduino nano einschalte wieder bei dem Schaltzustand ist vor dem ausschalten. geht das irgendwie?

Hier mal was ich habe bis jetzt.

#include <SoftwareSerial.h>

#define ledPin 13
#define ledPin2 12

#define rxPin 10
#define txPin 11

SoftwareSerial btSerial(rxPin, txPin);
String btData;

void setup() {
 btSerial.begin(9600);
 btSerial.println("bluetooth available");
 pinMode(ledPin,OUTPUT);
 pinMode(ledPin2,OUTPUT);
}

void loop() {
 if (btSerial.available()){
   btData = btSerial.readString();
     if(btData=="race"){
       digitalWrite(ledPin,1);
       digitalWrite(ledPin2,0);
       btSerial.println("LED on Pin 13 is on and Pin 12 is off");}
       
     
     
     if(btData=="cruise"){
       digitalWrite(ledPin2,1);
       digitalWrite(ledPin,0);
       btSerial.println("LED on Pin 12 is on");}
       
     if (btData=="off"){
       digitalWrite(ledPin2,0);
       digitalWrite(ledPin,0);

       btSerial.println("LED on Pin 12 and 13 is off");}
     
   }
   delay(100);
}

wäre froh um jede Hilfe :slight_smile:

geht das irgendwie?

Vermutlich ja...
Denn der Nano hat ein EEPROM im Bauch.

siegl1009:
Ich will gerne das wenn ich den Arduino nano einschalte wieder bei dem Schaltzustand ist vor dem ausschalten. geht das irgendwie?
...
wäre froh um jede Hilfe :slight_smile:

Für solche Fälle hat ein Arduino bzw. der darauf verbaute Mikrocontroller ein EEPROM. Schreib den Schaltzustand einfach immer ins EEPROM, damit er da drin steht, wenn Du den Arduino ausschaltest. Evtl. hilft mein aufgebohrter Merkzettel.

Gruß

Gregor

An dieser Stelle halte ich (Anfänger) es für sinnvoll zu erwähnen, dass sich der EEPROM nicht unendlich oft beschreiben lässt.
Der Wert des letzten Zustandes sollte also eher "aktualisiert" werden anstatt ihn jedes mal zu überschreiben.

Oder ist das vernachlässigbar ?

Hoffe ich hab nicht zu viel "verraten" und trotzdem geholfen :grinning:

Gruß

schUk0

schUk0:
Oder ist das vernachlässigbar ?

Wie man's nimmt. Atmel garantiert 100.000 Schreibzyklen. Wenn man nicht gerade sekündlich schreibt, hält das ziemlich lange. Und noch viel länger, wenn man das EEPROM so beschreibt, dass nicht immer die gleichen Speicherzellen benutzt werden. Man muss dann halt zwei Bytes für den Zeiger auf die nächste zu beschreibende Speicherzelle reservieren (oder sich die zuletzt benutzte merken, oder ...).

Gruß

Gregor

Ich habe mir eine Schaltung programmiert damit ich eine Relais-schaltung schalten kann

Ein Relais kann auch nicht unendlich oft schalten. Die Lebensdauer hängt zwar viel von der geschalteten Stromstärke ab, aber so ganz grob kann man mal ähnliche Größenordnung annehmen.
Also sicherstellen, dass das EEPROM nur bei Änderungen beschrieben wird.
Ich frage mich, wie Gregor's Trick mit der wechselnden Speicherstelle funktionieren soll. Dieser Zeiger müsste doch auch ins EEPROM ?
Wird der nur bei jedem Neustart oder alle 50.000 Schreibzyklen weitergestellt?

Dieser Zeiger müsste doch auch ins EEPROM ?

Kann er ja ruhig!
Dafür ist das EEPROM ja da...

@michael_x: das ist relativ einfach.

-du schreibst deinen Wert an eine beliebige EEPROM-Adresse
-in die nächste Adresse schreibst du etwas eindeutiges (FF z.B.)

Beim Lesen suchst du jetzt nach dem Wert (FF) und gehst von da aus eine Adresse zurück. Du hast deinen Wert gefunden.
Die Adresse, wo "FF" stand, merkst du dir, hierhin wird nun der nächste, neue Wert geschrieben, und in die darauffolgende wiederum "FF".
Da bei der Vorgehensweise der Marker immer überschrieben wird, klappt das problemlos.
Du musst nur die letzte EEPROM-Adresse natürlich etwas anders behandeln, aber das ist auch nicht schwer.
Und: das Ganze funktioniert natürlich auch mit mehreren Werten.

So nutzt du den gesamten Adressbereich (das funktioniert, ähnlich, natürlich auch mit nem kleineren Adressbereich) gleichmässig ab.

-in die nächste Adresse schreibst du etwas eindeutiges (FF z.B.)

:wink:
Ich glaube, 0xff ist bei EEPROMs alles andere als eindeutig.

Aber grundsätzlich hast du natürlich recht: Es ist gar nicht schwer…

Es ist auch wieder einfach nur ein endlicher Automat.
So wie immer…

Wenn Du sowieso eine RTC (Uhr) brauchst dann kannst Du Dir ein Modell mit gepuffertem RAM aussuchen und dorthin anstatt im EEprom die Daten abspeichern.
Grüße Uwe

combie:
Ich glaube, 0xff ist bei EEPROMs alles andere als eindeutig. …

Wieso das? 0xFF ist 0xFF, egal, ob das im EEPROM, im RAM oder sonstwo steht.

Gruß

Gregor

uwefed:
Wenn Du sowieso eine RTC (Uhr) brauchst dann kannst Du Dir ein Modell mit gepuffertem RAM aussuchen und dorthin anstatt im EEprom die Daten abspeichern.
Grüße Uwe

Oder bei einem DS3231-RTC-Modul den EEPROM durch FRAM austauschen. Das haben wir hier beschrieben.

Gruß Tommy

gregorss:
Wieso das? 0xFF ist 0xFF, egal, ob das im EEPROM, im RAM oder sonstwo steht.

Nunja, weil ein gelöschtes EEPROM komplett mit 0xff geflutet ist.
Darum erscheint mir die Aussage "etwas eindeutiges (FF z.B.)" irgendwie falsch.

Bei der beschriebenen Vorgehensweise wäre dann das erste 0xff (von unten) das gesuchte. So, wie beschrieben.

Gruß Tommy

combie:
Nunja, weil ein gelöschtes EEPROM komplett mit 0xff geflutet ist.
Darum erscheint mir die Aussage "etwas eindeutiges (FF z.B.)" irgendwie falsch.

0xff ist also etwas Eindeutiges, egal, wo es steht. Ich finde, dass Du Dich mit solchen Aussagen entweder zurückhalten oder sie so erläutern solltest, das es ein Anfänger versteht. Gerade für Anfänger sind Deine ultrakurz-Behauptungen nur verwirrend, weil irreführend (und schlicht falsch).

Gruß

Gregor

Es ist auch wieder einfach nur ein endlicher Automat

Na, wenn du jedes if einen endlichen Automaten nennst, bleibe ich dabei "Endlicher Automat ist ein bescheuerter Ausdruck."

Und Danke, das mit dem 0xff habe ich verstanden. :wink:
Wenn 0xff ein Wert ist, den ich nicht verwende, ausser für den Zustand unbeschrieben, ist es dann natürlich eindeutig.
Da ein gelöschter EEPROM schon überall den Wert 0xFF hat, bietet sich das als Endekennung an.

0xff ist also etwas Eindeutiges, egal, wo es steht.

Ist es nicht!
Es ist nicht eindeutig.
Vielleicht aus pragmatischer Sicht, also unter Einbeziehung des Kontextes.

Aber semantisch eindeutig ist es nicht, denn 0xff kann sowohl in Nutzdaten vorkommen, als auch eine ungenutzte Speicherstelle kennzeichnen. Und damit ist es Mehrdeutig.

Wenn 0xff ein Wert ist, den ich nicht verwende, ausser für den Zustand unbeschrieben, ist es dann natürlich eindeutig.

Richtig!
Das ist die pragmatische Sicht.
Aber dann darf man ihn aber auch nie schreiben.

bleibe ich dabei "Endlicher Automat ist ein bescheuerter Ausdruck."

Und wenn ich es "Zustandsmaschine" nenne?

combie:
Ist es nicht!
Es ist nicht eindeutig.

Doch. Eine 1 ist eine 1 so wie eine 0 eine 0 ist. Was eine 1 bedeutet, ist zwar vom Kontext abhängig, aber das geht aus einer derart verkürzten Behauptung wie Deiner nicht hervor (was Anfänger, die hier üblicherweise ankommen, verwirrt). Blöderweise gibt es hier kein Threading, wodurch oft nicht klar ist, auf wen oder auf was für eine Aussage sich jemand bezieht. Wenn es das gäbe, könnte man deutlich besser erkennen, was der Kontext ist und welche Gesprächs-(Sub)-Fäden man ignorieren kann.

Gruß

Gregor

Und wenn ich es "Zustandsmaschine" nenne?

Klar kann man überall Zustandsmaschinen sehen, oder endliche Automaten.
Jeder digital-Computer und damit alle Software dieser Welt bildet zwangsläufig einen endlichen Automaten.
Oder sogar sehr viele parallel ablaufende endliche Automaten, die untereinander nur wenige Verbindungen haben.

Kann man auch streiten ob es zig parallel endliche Automaten sind oder nur ein großer.

Nur was bringt es mir, das so zu sehen bzw. es so zu nennen?

Vermutlich habe ich sogar ein ähnliches Bild von der ganzen Geschichte im Kopf wie du, und wenn ich einen wie mich ärgern wollte, könnte ich öfters drauf hinweisen: Siehste, eine state machine :wink:

Vielen Dank siegl1009, für deinen schönen Thread.
Ich hoffe, der knappe Hinweis auf EEPROM hat dir schon genug geholfen.
Die Zustände von zwei LED kann man bequem in ein einziges Byte schreiben.

Spasseshalber könntest du statt 0 / 1 / 2 auch btData.charAt(0)oderbtData[0]nehmen. Das wäre 'o' 'c' 'r' für einen deiner 3 Zustände off / cruise /race.