Per Bluetooth eimalige Daten senden, bis sich der Zustand ändert

Hallo zusammen,

ich brauche mal ein wenig Hilfestellung von euch.

Kurz erklärt, was ich vor habe:

Aufbau A

A ist das sogennate Sender "Board". Hier soll ein Wert vom LDR bzw. Lichtsensor ausgelesen werden und je nach Zustand die 0 und 1 an das Bluetooth übermittelt werden.

Aufbau B

B ist der empfänger der Daten vom Aufbau A. Hier sollen die 0 und 1 Empfangen werden und LEDs bzw. ein LED W2812 Stripe zeigt infos an, wenn es null oder eins empfängt.

Jetzt habe ich 2 Sketche. Einen zum Empfangen und einen zum senden.

Beim Senden habe ich jedoch das Problem, dass ständig 1 gesendet wird, und die LED dadurch sehr schnell blinkt, bzw. überhaupt kein Wechsel statt finden.

Sprich 1x senden von 1 = LED an. Gleichzeitig jedoch nicht mehr weiter reagieren, bzw. dadurch Energiespraen, bis eine 0 empfangen wird.

Was habe ich hier falsch gemacht, bzw. wo liegt der Fehler?

Da dass ganze über Li-Ion Akku gesteuert werden sollte, wird dieser auf Dauer sehr schnell leer werden, da ja ein ständiger "Datenverbrauch" stattfindet.

Irgendwelche Tipps?

Sendercode:

#include <SoftwareSerial.h>

int eingang= A0; //Das Wort „eingang“ steht jetzt für den Wert „A0“ (Bezeichnung vom Analogport 0)
int LED = 7; //Das Wort „LED“ steht jetzt für den Wert 10
int sensorWert = 0; //Variable für den Sensorwert mit 0 als Startwert



void setup(){

 Serial.begin(9600);  //serieller Monitor wird gestartet, Baudrate auf 9600 festgelegt


 
}
 
void loop(){
     sensorWert = analogRead(A0);
 

    if (sensorWert > 500 ) //Wenn der Sensorwert über 512 beträgt….
    {
digitalWrite( LED, LOW);
       Serial.write ('1'); 



    }
   else
    {
    
       Serial.write ('0'); 
       digitalWrite (LED, HIGH);     
    }
  }

Empfängercode (abgewandelt vom bereits vorhanden Code (Attiny)):

#include <SoftwareSerial.h>
char bluetoothagent; //Werte sollen per Bluetooth gesendet werden
boolean ledstatus3,ledstatus4;
#define RxD 1
#define TxD 2

SoftwareSerial mySerial(1,2);  //rx, tx

void setup(){
  pinMode(1, INPUT);
  pinMode(2, OUTPUT);
 mySerial.begin(9600);  //serieller Monitor wird gestartet, Baudrate auf 9600 festgelegt
 pinMode(3,OUTPUT);  //PIN 13 wird als Ausgang festgelegt
 pinMode(4,OUTPUT);  //PIN 12 wird als Ausgang festgelegt

 
}
 
void loop(){
if(mySerial.available());       //wenn Daten empfangen werden...       //wenn Daten empfangen werden...     
 {
    bluetoothagent=mySerial.read();//..sollen diese ausgelesen werden
 

    if (bluetoothagent=='1') //wenn das Bluetooth Modul eine „1" empfängt..
    {
           digitalWrite(3,HIGH);  
           digitalWrite(4,LOW);

          
    }
    if (bluetoothagent=='0') //wenn das Bluetooth Modul eine „0" empfängt..
    {
       digitalWrite(3, LOW);    
       digitalWrite(4,HIGH);       
    }
  }
}

Du musst Dir den alten wert merken und erst wieder senden, wenn der neue Wert != alter Wert ist.

Gruß Tommy

Hallo Tommy,

danke für die Antwort. Würde aber bedeuten, ich kann den Wert nur beim Empfänger =! setzen, jedoch nicht damit den Sender optimieren? Dieser würde quasi immer messen, außer man macht ein Delay rein, in dem er eine Pause einlegt. Ist das so richtig?

Lies Dir meinen Beitrag nochmal verstehend durch. Ich habe vom Senden geschrieben.

Pausen kannst Du mit delay oder besser mit millis() - BlinkWithoutDelay - realisieren.

Gruß Tommy

Also mit dem alten Wert merken verstehe ich das so:

Sofern sich der gesetzte Wert z. B. 500 auf 100 ändert, und dies jedoch nicht dem zuvor erfassten Wert 500 entspricht, dann entweder 0 oder 1 senden?

Also in etwa so? (Sorry, wenn ich es nicht gleich verstehe.. In der Theorie einfach wie in C...

   if (sensorWert =! sensorWert) //Wenn der Sensorwert über 512 beträgt….
    {
digitalWrite( LED, LOW);
       Serial.write ('1');  


    }
   else
    {   
       Serial.write ('0'); 

       digitalWrite (LED, HIGH);

if (sensorWert =! sensorWert) wird nie wahr.
Etwa so könntest Du es tun, Wenn 500 Deine Grenze ist. Wenn der Wert immer um 500 pendelt, dann wird natürlich laufend gesendet. Dann solltest Du eine Hysterese einbauen.

boolean an;

void loop() {
  sensorWert = analogRead(A0); 
  if (!an && sensorWert > 500) {
    an = true;
    // Sende 1
  }
  if (an && sensorWert <=500) { // evtl. eine Hysterese einbauen 495
    an = false;
    // Sende 0
  }
}

Gruß Tommy

Danke Tommy,

ok. Also mit Boolean den Status merken.. Jetzt besteht nur noch das Problem, dass "true = '1'" nur 1x funktioniert. Es wird auch nur 1x eine 1 angezeigt im Monitor.. Sobald aber die 0 eintritt mach er wieder wie wild 01010101010...

Muss man hier vielleicht ein 2. Bool oder so einbauen? Ich verstehe nicht ganz, warum das nur beim ersten Mal richtig funktioniert.

Ich vermute mal, das genau das eintritt was du geschrieben hast, nämlich das dann laufend gesendet wird.. Doch wie schafft man es, eine klare Grenze zu bekommen? Im Moment schwankt der gemessene Wert ziemlich stark, so dass man wohl eine Hystere braucht?

Dann musst Du die Hysterese vergrößern. Ein analogRead schwankt immer etwas. Das darf nicht zu laufenden Wechseln führen. Zwischen Einschalten und Ausschalten muss es einen Abstand geben - die Hysterese.

Gruß Tommy

Danke Tommy für deine große Hilfe. Es funktioniert.. Habe zu dem Wert einfach noch +/-15 ergänzt und dann hat es getan was es sollte :slight_smile: Einfaches senden von 0 und 1.

Super!!