Ich möchte Funksteckdosen schalten und zwar möchte ich mittels Bruteforce alle 5Bit Möglichkeiten der Systemcodes und Steckdosen Codes abarbeiten. Später soll mir auf dem Display ausgeben werden welche Codes geschaltet werden gerade, das ist aber Nebensache.
Im moment zerbrech ich mir gerade den Kopf wie ich ne for schleife oder dergleichen mit der rcswitch Lib verbinde.
#include<RCSwitch.h>
RCSwitch mySwitch =RCSwitch();
void setup(){
//Starte die Übertragung an Pin 10 oder wo Data angeschlossen sein mag
mySwitch.enableTransmit(10);
}
void loop(){
// Befehl zum Anschalten
// 1. Gruppe = Systemcode Register 1-5
// 2. Gruppe = Steckdose A-E (Register 6-9)
mySwitch.switchOn("11011","00100");
Kann mir jemand nen Tip geben wie ich zuerst das Systemcode register generiere , dort alle 32 Möglichkeiten der 2.Gruppe abarbeite und danach in der ersten Gruppe eine Möglichkeit weiter gehen und dann wieder 2. Gruppe abarbeite.
Das Problem könnte aber für ihn sein, dass er aus der for Schleife nicht eher rauskommt bevor sie fertig ist. Dann müßte er ohne for Schleifen inkremmentieren und Nullen usw.
Doc_Arduino:
Das Problem könnte aber für ihn sein, dass er aus der for Schleife nicht eher rauskommt bevor sie fertig ist. Dann müßte er ohne for Schleifen inkremmentieren und Nullen usw.
Aus einer einzelnen for-Schleife kommt man mit break raus. Aus verschachtelten for-Schleifen auszubrechen ist eine der seltenen legitimen Verwendungen von goto
Eine andere Alternative ist ein flag, das man mit der Schleifen-Bedingung abfragt und auf false setzt wenn man aufhören will.
Ach ja, wenn du unbedingt eine konstante Breite brauchst (also z.B. "000" statt "0") könnte man z.B. das machen:
char buffer[9];
const int WIDTH = 8;
int value = 96;
itoa(value, buffer, 2);
int length = strlen(buffer);
if(length < WIDTH)
{
memmove(buffer - length + WIDTH, buffer, length + 1);
for(int i = 0; i < WIDTH - length; i++)
*(buffer + i) = '0';
}
Das verschiebt den resultierenden String um die Differenz zwischen gewünschter Breite und tatsächlicher Länge nach rechts und füllt dann links mit Nullen auf.
Du brauchst zwei getrennte Puffer dafür! Sonst überschreibst du beim zweiten Aufruf den ersten String.
Und das produziert keine führenden Nullen. Keine Ahnung ob der String immer konstant 5 Zeichen breit sein muss. Habe oben mal eine Lösung hingeschrieben.
Sich selbst eine Konvertierungsfunktion zu schreiben die das von Anfang an macht wäre hier eventuell schneller.
Aber wenn du mit "0" statt "00000" oder "10" statt "00010" leben kannst, reicht einfach itoa()
Wobei man es auch ganz einfach machen könnte und einfach ein Array aus allen Strings anlegen könnte. Bei nur 5 Zeichen ist das nicht viel (32 * 6 Bytes). Dann kann man einfach mit der Zahl als Index den gewünschten String erhalten
Es müssen definitiv werte wie 00010 sein. Hmmm . Ich bin kein C Kenner geb ich ganz ehrlich zu da qualmt mir immer der Kopf. Mal schauen wie ich das rein bekomme
Da bräuchte ich aber genau so ein Array mit den Zahlen die zu den DIP Positionen passen. Und da ich mir eh die DIP Werte ausgeben lassen möchte is das ja jetzt genauso wie ich es haben wollte.
uwefed:
Auch eine Zahl kannst Du als Binärzahl ( Nullen und Einsen) ausgeben. Dazu brauchst Du keinen String.
Grüße Uwe
Ja das weiss ich aber was währe den jetzt mein Vorteil davon? Die Zahlen währen ja nicht aufeinander folgend wie ich ich sie im Ablauf brauche. So das ein einfacher Zähler weg fällt.
Du verbrauchst weniger RAM. 192 Bytes sind das schon fürs Array. Ich weiß nicht wie Du die Ausgabe machst aber da kommen dann sicher auch noch etwas RAM zusammen.
Grüße Uwe
warum sollen die nicht aufeinanderfolgend sein? Eine Zahl bleibt immer die gleiche, nur in verschiedenen Zahlensystemem eben verschieden dargestellt.
dezimal 0 ist binär 0
dezimal 1 ist binär 1
dezimal 2 ist binär 10
dezimal 3 ist binär 11
...
dezimal 9 ist binär 1001
usw.
jeweils binär ohne führende Null(en) geschrieben.
Außerdem, fällt mir gerade auf, wie kommt man mit 5Bit auf 1024 mögliche Bitkombinationen? Ich denke, Du müßtest Dich mit Zahlensystemen und deren Umrechnung näher befassen.