Go Down

Topic: Senden von Zahlenwerten über HC-05 und HC-06 (Read 2514 times) previous topic - next topic

adruinoboy

#60
Apr 23, 2020, 09:38 pm Last Edit: Apr 23, 2020, 09:40 pm by adruinoboy
Hallo Combie, danke für den Hinweis. Ich habe auch schon vorher den Gedanken gehabt einen Watchdog einzufügen, aber das schien mir zu kompliziert.

Ich habe in meinen Sketch stumpf den Nachtwächter-Sketch von folgender Seite eingebaut:
https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Und dann meine delay-Zeiten gelöscht.


Code: [Select]


#include <Streaming.h>    //Bibliothek zur BT Verbindung
#include <SoftwareSerial.h>
#include "DHT.h"          //DHT Bibliothek laden

enum Comand {
              Temperatur   = 1,
              Feuchtigkeit = 2
            };

// constants won't change. Used here to set a pin number:
const int ledPin = LED_BUILTIN;

// Variables will change:
int ledState = LOW;

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;
//constants won´t change
const long interval = 1000;

#define ledR 11
#define ledG 12
#define ledB 13
#define rxPin 3
#define txPin 4
#define DHTPIN 2
#define DHTTYPE DHT22   //Es handelt sich um den DHT22 Sensor

SoftwareSerial btSerial(rxPin, txPin);
DHT dht(DHTPIN, DHTTYPE); //Der Sensor wird ab jetzt mit "dht" angesprochen

void setup()
{
  btSerial.begin(9600);
  Serial.begin(9600);
  dht.begin();
    //Festlegen der Ein- und Ausgänge für die BL Verbindung
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(13,OUTPUT);
  //set the digital pin as output:
  pinMode(ledPin, OUTPUT);
  analogWrite(ledB,255);  //Blaue LED wird eingeschaltet
}

void loop()
{
  //Bestätigung zur erfolgreichen Funkanmeldung
  analogWrite(ledR,0);analogWrite(ledG, 255);analogWrite(ledB,0); //LED Grün an

  // here is where you'd put code that needs to be running all the time.

  // check to see if it's time to blink the LED; that is, if the difference
  // between the current time and last time you blinked the LED is bigger than
  // the interval at which you want to blink the LED.
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval)
  {//save the last time you blinked the LED
    previousMillis = currentMillis;
  }
  //if the LED is off turn it on and vice-versa
  if(ledState == LOW)
  {
    ledState = HIGH;
  }
  else
  {
    ledState = HIGH;
  }
  //set the LED with the ledState of the variable
  digitalWrite(ledPin, ledState);

  float tempaussen = dht.readTemperature(); //Temperatur außen wird gemessen und gespeichert
  float feuchteaussen = dht.readHumidity(); //Luftfeuchte außen wird gemessen und gespeichert
 
  //Senden der Messwerte
  btSerial << Temperatur << ',' << tempaussen << ';' << endl;
 
  btSerial << Feuchtigkeit << ',' << feuchteaussen << ';' << endl;
  /*****************************************/

//Löschen der Messwerte
   tempaussen = 0;     //Der Wert für Temperatur wird genullt
   feuchteaussen = 0;  //Der Wert für Feuchte wird für die nächste Runde genullt
 
  analogWrite(ledR,255);analogWrite(ledG,0);analogWrite(ledB,0); //Rote LED an
}


Beim Hochladen gab es keine Fehlermeldung, aber die Zahlenwerte werden nicht gesendet. Die Bluetoothmodule finden sich, aber auf dem Display und auf dem seriellen Monitor wird nichts ausgegeben.
Ich freue mich, wenn mir jemand weiterhelfen könnte.

postmaster-ino

Hi

Sorry - aber den Nachtwächter sehe ich nicht wirklich.
Du merkst Dir alle x Millisekunden die neue Uhrzeit - mehr aber auch nicht.
IMMER werden die LED auf Grün gestellt, die Messungen gemacht, die LED umgeschaltet, Zeugs ans BT-Modul geschickt und die rote, statt der grünen LED angeworfen.

Was soll das Ganze machen?

MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

combie

#62
Apr 24, 2020, 10:30 am Last Edit: Apr 24, 2020, 10:33 am by combie
Ein paar Tipps könnte ich dir geben...
Denn im Augenblick kann ich dein Programm nicht gut lesen.

Ich fange mal an:

> const int ledPin = LED_BUILTIN;
Eigentlich gut, und richtig so, wenn da nicht ein:
> #define ledB 13
folgen würde...

Ich rate da zu es einheitlich zu machen!!!
Entweder alle als defines oder als Konstanten.
Ich empfehle Konstanten.


Dann ist ist auch noch LED_BUILTIN in der Regel 13

Da steht dann also:
Code: [Select]

const int ledPin = 13;
#define ledB 13


Du verwendest die LED an Pin 13 doppelt.


Code: [Select]
pinMode(11,OUTPUT);
pinMode(12,OUTPUT);
pinMode(13,OUTPUT);
//set the digital pin as output:
pinMode(13, OUTPUT); //  ledPin durch 13 ersetzt

Du siehst die Unsinnigkeit des doppelten?

Wen du schon Symbole/Bezeichner für die LED verwendest, dann setze sie auch konsequent ein!

Code: [Select]
pinMode(ledR,OUTPUT);
pinMode(ledR,OUTPUT);
pinMode(ledB,OUTPUT);



----------

Code: [Select]
analogWrite(ledR,0);analogWrite(ledG, 255);analogWrite(ledB,0); //LED Grün an
Sowas schmeckt mir auch nicht sonderlich.

Alternativen:

Schön untereinander, eine Anweisung pro Zeile maximal.
(üblich)
Code: [Select]
analogWrite(ledR,  0);
analogWrite(ledG,255);
analogWrite(ledB,  0);



Verketten, mit dem Anweisungsverkettungsoperator.
(nicht so schön, weil es keine Notwendigkeit dafür gibt)
Code: [Select]
analogWrite(ledR,0),analogWrite(ledG, 255),analogWrite(ledB,0); //LED Grün an



Die beste Lösung:
Den LED Melderkram in eine Funktion/Klasse auslagern.
Sauber, wiederverwendbar, leicht zu lesen.
Der Verstand, und die Fähigkeit ihn zu gebrauchen, sind zweierlei Fähigkeiten.

adruinoboy

#63
Apr 24, 2020, 05:46 pm Last Edit: Apr 25, 2020, 02:52 pm by adruinoboy
Danke Combie für die Tipps. Ich habe das gesagte angewendet.
Jetzt müsste der Sketch mehr nach deinem Geschmack sein.

Code: [Select]


#include <Streaming.h>    //Bibliothek zur BT Verbindung
#include <SoftwareSerial.h>
#include "DHT.h"          //DHT Bibliothek laden

enum Comand {
              Temperatur   = 1,
              Feuchtigkeit = 2
            };

int ledState = LOW;             
const int ledR = 11;
const int ledG = 12;
const int ledB = 13;

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;

//constants won´t change
const long interval = 1000;

#define rxPin 3
#define txPin 4
#define DHTPIN 2
#define DHTTYPE DHT22   //Es handelt sich um den DHT22 Sensor

SoftwareSerial btSerial(rxPin, txPin);
DHT dht(DHTPIN, DHTTYPE); //Der Sensor wird ab jetzt mit "dht" angesprochen

void setup()
{
  btSerial.begin(9600);
  Serial.begin(9600);
  dht.begin();
    //Festlegen der Ein- und Ausgänge für die BL Verbindung
  pinMode(ledR,OUTPUT);
  pinMode(ledG,OUTPUT);
  pinMode(ledB,OUTPUT);
  //set the digital pin as output:
  analogWrite(ledB,255);
}

void Lampegruen()
{
  //Bestätigung zur erfolgreichen Funkanmeldung
  analogWrite(ledR,0);
  analogWrite(ledG, 255);
  analogWrite(ledB,0);
}

void Lamperot()
{
  analogWrite(ledR,255);
  analogWrite(ledG,0);
  analogWrite(ledB,0);
}

void loop()
{
  Lampegruen();

  // check to see if it's time to blink the LED; that is, if the difference
  // between the current time and last time you blinked the LED is bigger than
  // the interval at which you want to blink the LED.
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval)
  {
    //save the last time you blinked the LED
    previousMillis = currentMillis;
  }
  //if the LED is off turn it on and vice-versa
  if(ledB == LOW)
  {
    ledState = HIGH;
  }
  else
  {
    ledState = HIGH;
  }
  //set the LED with the ledState of the variable
  digitalWrite(ledB, ledState);

  float tempaussen = dht.readTemperature(); //Temperatur außen wird gemessen und gespeichert
  float feuchteaussen = dht.readHumidity(); //Luftfeuchte außen wird gemessen und gespeichert
 
  //Senden der Messwerte
  btSerial << Temperatur << ',' << tempaussen << ';' << endl;
 
  btSerial << Feuchtigkeit << ',' << feuchteaussen << ';' << endl;
  /*****************************************/

//Löschen der Messwerte
   tempaussen = 0;     //Der Wert für Temperatur wird genullt
   feuchteaussen = 0;  //Der Wert für Feuchte wird für die nächste Runde genullt

   Lamperot();
}


Ich weiß nicht genau, wie ich den Nachtwächter programmieren kann.
Ich freue mich über Anregungen.

adruinoboy

Ich habe jetzt den Nachtwächter angepasst. Jetzt müsste dieser aber funktionieren.

Code: [Select]


#include <Streaming.h>    //Bibliothek zur BT Verbindung
#include <SoftwareSerial.h>
#include "DHT.h"          //DHT Bibliothek laden

enum Comand {
              Temperatur   = 1,
              Feuchtigkeit = 2
            };

int LedStatus = LOW;
int LedPin = 13;
unsigned long LED_timestore;   //Variable Speicher für Systemzeit
const long interval = 1000;

#define rxPin 3
#define txPin 4
#define DHTPIN 2
#define DHTTYPE DHT22   //Es handelt sich um den DHT22 Sensor

SoftwareSerial btSerial(rxPin, txPin);
DHT dht(DHTPIN, DHTTYPE); //Der Sensor wird ab jetzt mit "dht" angesprochen

void setup()
{
  btSerial.begin(9600);
  Serial.begin(9600);
  dht.begin();
    //Festlegen der Ein- und Ausgänge für die BL Verbindung
  pinMode(LedPin, OUTPUT);  //teilt dem Arduino mit, dass das ein Ausgang ist
}

void loop()
{
  if (LedStatus == LOW)
  {
    if (millis() - LED_timestore>1000)
    {
    digitalWrite (LedPin, HIGH);
    LED_timestore = millis();
    LedStatus = HIGH;
    }
  }
  else
  {
    if (millis() - LED_timestore>300)
    {
      digitalWrite(LedPin, LOW);
      LedStatus = LOW;
    }
  }

  float tempaussen = dht.readTemperature(); //Temperatur außen wird gemessen und gespeichert
  float feuchteaussen = dht.readHumidity(); //Luftfeuchte außen wird gemessen und gespeichert
 
  //Senden der Messwerte
  btSerial << Temperatur << ',' << tempaussen << ';' << endl;
 
  btSerial << Feuchtigkeit << ',' << feuchteaussen << ';' << endl;
  /*****************************************/

//Löschen der Messwerte
   tempaussen = 0;     //Der Wert für Temperatur wird genullt
   feuchteaussen = 0;  //Der Wert für Feuchte wird für die nächste Runde genullt
}


Meine beiden Funkmodule verbinden sich nicht. Weiß jemand woran das liegt.
Beide suchen sich fleißig, aber können sich nicht finden.

adruinoboy

Ich habe nochmal beide Sketch miteinander verglichen. Der Sendersketch mit Nachtwächter und den Sendersketch ohne Nachtwächter.
Am Werteauslesen und senden habe ich nichts geändert. Wie kann es sein, dass die Verbindung mit dem sketch ohne Nachtwächter eingegangen wird und die Verbidung mit dem Sketch ohne Nachtwächter nicht eingegangen wird.
Der einzige Unterschied liegt ja nur am Anfang des Cods, wo die Variablen definiert werden und am Anfang der Loop, wo die Nachtwächteraktion durchgeführt wird.

Ich freue mich über Tipps und Hinweise.

combie

In den ersten Sketches wurde noch mit ein paar Sekunden Abstand gesendet.

Jetzt donnerst du das Zeugs ohne Gnade raus.

Ist das ein Unterschied?
Ja!

Ist er Relevant?
KA.
Der Verstand, und die Fähigkeit ihn zu gebrauchen, sind zweierlei Fähigkeiten.

adruinoboy

#67
Apr 30, 2020, 08:42 pm Last Edit: Apr 30, 2020, 11:39 pm by adruinoboy
So, jetzt hat es geklappt.
Danke, Combie für den Hinweis. Die delays sind mir gar nicht aufgefallen.
Auf jeden Fall finden sich die Funkmodule wieder.

Ich musste den HC-05 noch mal mit den AT-Commands einstellen. Warum der manchmal so zickt weiß ich auch nicht. Der vertsellt sich immer: Er verliert "AT+ROLE=1" und "AT+CMODE=1" immer wieder.

Jetzt schickt der Sender sein Signal und der Empfänger schreibt die Zahlen fein säuberlich auf das Display. Nebenbei läuft der Nachtwächter und schaltet beim Sender die LED an Pin 13 alle 6 Sekunden an und aus.

Also, herzlichen Dank an alle die zu meinem Problem und zur Hilfe aller beigetragen haben.
Für alle, die ein ähnlichen Problem haben sollten, hier ein Sketch, der soweit funktioniert.
Zunächst der Sender mit Nachtwächter:

Code: [Select]


#include <Streaming.h>    //Bibliothek zur BT Verbindung
#include <SoftwareSerial.h>
#include "DHT.h"          //DHT Bibliothek laden

enum Comand {
              Temperatur   = 1,
              Feuchtigkeit = 2
            };

int LedStatus = LOW;
int LedPin = 13;
unsigned long LED_timestore;   //Variable Speicher für Systemzeit
const long interval = 1000;

#define rxPin 3
#define txPin 4
#define DHTPIN 2
#define DHTTYPE DHT22   //Es handelt sich um den DHT22 Sensor

SoftwareSerial btSerial(rxPin, txPin);
DHT dht(DHTPIN, DHTTYPE); //Der Sensor wird ab jetzt mit "dht" angesprochen

void setup()
{
  btSerial.begin(9600);
  Serial.begin(9600);
  dht.begin();
    //Festlegen der Ein- und Ausgänge für die BL Verbindung
  pinMode(LedPin, OUTPUT);  //teilt dem Arduino mit, dass das ein Ausgang ist
}

void loop()
{
  if (LedStatus == LOW)
  {
    if (millis() - LED_timestore>1000)
    {
    digitalWrite (LedPin, HIGH);
    LED_timestore = millis();
    LedStatus = HIGH;
    }
  }
  else
  {
    if (millis() - LED_timestore>300)
    {
      digitalWrite(LedPin, LOW);
      LedStatus = LOW;
    }
  }

  float tempaussen = dht.readTemperature(); //Temperatur außen wird gemessen und gespeichert
  float feuchteaussen = dht.readHumidity(); //Luftfeuchte außen wird gemessen und gespeichert
 
  //Senden der Messwerte
  delay(3000);
  btSerial << Temperatur << ',' << tempaussen << ';' << endl;

 delay(3000);
  btSerial << Feuchtigkeit << ',' << feuchteaussen << ';' << endl;
  /*****************************************/

//Löschen der Messwerte
   tempaussen = 0;     //Der Wert für Temperatur wird genullt
   feuchteaussen = 0;  //Der Wert für Feuchte wird für die nächste Runde genullt
}


Der Empfänger-Sketch sieht so aus:

Code: [Select]


#include <CmdMessenger.h> //Bibliothek zur BT Verbindung
#include <Streaming.h>    //Bibliothek zur BT Verbindung
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h> //LiquidCrystal_I2C Bibliothek einbinden

///////////Für das "°" Zeichen ////////////

byte degree[8] = {
  B01110,
  B01010,
  B01110,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
};

/////////////Für das "³" Zeichen ////////////////

byte hochdrei[8] = {
  B00111,
  B00001,
  B00011,
  B00001,
  B00111,
  B00000,
  B00000,
  B00000
};

enum Comand {
              Temperatur   = 1,
              Feuchtigkeit = 2
            };

#define ledfR 8
#define ledfG 9
#define ledfB 10
#define ledR 11
#define ledG 12
#define ledB 13
#define rxPin 3
#define txPin 4

float t = 0;
float f = 0;
float ti = 0;
float fi = 0;

LiquidCrystal_I2C lcd(0x27, 20, 4); //Hier wird festgelegt um welches Display es sich handelt
SoftwareSerial btSerial(rxPin, txPin);

CmdMessenger cmdMessenger {btSerial};

void setup()
{
  Serial.begin(9600);
  btSerial.begin(9600);
  Serial << "Start: "<< __FILE__ << endl;

 
  cmdMessenger.attach(Temperatur, [](){
                                         t = cmdMessenger.readFloatArg();
                                         Serial << "Temperatur " << t << " °C" << endl;
                                      });
                                     
  cmdMessenger.attach(Feuchtigkeit, [](){
                                           f = cmdMessenger.readFloatArg();
                                           Serial << "Feuchtigkeit " << f << " %" << endl;
                                        });

 pinMode(8,OUTPUT);
 pinMode(9,OUTPUT);
 pinMode(10,OUTPUT);
 pinMode(11,OUTPUT);
 pinMode(12,OUTPUT);
 pinMode(13,OUTPUT);
 lcd.init();           //Im Setup wird der LCD gestartet
 lcd.backlight();      //Hintergrundbeleuchtung einschalten
 analogWrite(ledR,0);
 analogWrite(ledG,0);
 analogWrite(ledB,255);
}

void loop()
{
  cmdMessenger.feedinSerialData();

  //Berechnung der absoluten Feuchtigkeit
  float RD = 461.5;
  float e_sat = 611.2*pow(2.7183, (17.62*t/(243.12+t)));
  float rho_sat = (e_sat*1000)/(RD*(t+273.15));
  float rho_fi = rho_sat*(f/100);
 
//Displayausgabe der Temperatur Außen
  if(t >= 9.95)
  {
  lcd.setCursor(0, 0);
  lcd.print("           ");
  lcd.setCursor(0, 0);
  lcd.print(t, 1);
  lcd.createChar(0, degree);
  lcd.setCursor(5, 0);
  lcd.write(0);
  lcd.print("C");
  }
 
  if(t < 9.95)
  {
  lcd.setCursor(0, 0);
  lcd.print("           ");
  lcd.setCursor(1, 0);
  lcd.print(t, 1);
  lcd.createChar(0, degree);
  lcd.setCursor(5, 0);
  lcd.write(0);
  lcd.print("C");
  }
 
  //Displayausgabe der Feuchtigkeit Außen
  if(f >= 9.95)
  {
  lcd.setCursor(0, 1);
  lcd.print("           ");
  lcd.setCursor(0, 1);
  lcd.print(f, 1);
  lcd.print(" %");
  }
 
  if(f < 9.95)
  {
  lcd.setCursor(0, 1);
  lcd.print("           ");
  lcd.setCursor(1, 1);
  lcd.print(f, 1);
  lcd.print(" %");
  }
 
  //Displayausgabe der absoluten Feuchtigkeit Außen
  if(rho_fi >= 9.95)
  {
  lcd.setCursor(0, 2);
  lcd.print("           ");
  lcd.setCursor(0, 2);
  lcd.print(rho_fi, 1);
  lcd.print(" g/m");
  }
 
  if(rho_fi < 9.95)
  {
  lcd.setCursor(0, 2);
  lcd.print("           ");
  lcd.setCursor(1, 2);
  lcd.print(rho_fi, 1);
  lcd.print(" g/m");
  }
  lcd.createChar(1, hochdrei);
  lcd.setCursor(8, 2);
  lcd.write(1);

//Auswertung der Luftfeuchtigkeit
 if((f < 30) or (f > 70))
{
 analogWrite(ledfR,255);
 analogWrite(ledfG,0);
 analogWrite(ledfB,0);
}
 if((f >= 30) and (f < 40) or (f > 60) and (f <= 70))
{
 analogWrite(ledfR,255);
 analogWrite(ledfG,100);
 analogWrite(ledfB,0);
}
if((f >= 40) and (f <= 60))
{
 analogWrite(ledfR,0);
 analogWrite(ledfG,150);
 analogWrite(ledfB,0);
}
  delay(5000);      //5 Sekunden Pause
}


Falls es für die Sketche irgendwelche Verbesserungen gibt, bin ich dafür offen.

adruinoboy

Ich wollte den Facelift von meinem Sender noch präsentieren. Jetzt wird nicht nur eine LED über die Nachtwächterfunktion an und aus geschaltet, sondern ich habe es jetzt hingekriegt, dass mit der Nachtwächterfunktion die Messwerte geschickt werden. Und zwar ganz ohne delay.
Das ist echt eine wichtige Funktion, wenn man den Mikrokontroller nicht untätig herumstehen lassen will.

Der Sendersketch sieht jetzt so aus:

Code: [Select]


#include <Streaming.h>    //Bibliothek zur BT Verbindung
#include <SoftwareSerial.h>
#include "DHT.h"          //DHT Bibliothek laden

enum Comand {
              Temperatur   = 1,
              Feuchtigkeit = 2
            };

unsigned long BT_timestore;   //Variable Speicher für Systemzeit

#define rxPin 3
#define txPin 4
#define DHTPIN 2
#define DHTTYPE DHT22   //Es handelt sich um den DHT22 Sensor

SoftwareSerial btSerial(rxPin, txPin);
DHT dht(DHTPIN, DHTTYPE); //Der Sensor wird ab jetzt mit "dht" angesprochen

void setup()
{
  btSerial.begin(9600);
  Serial.begin(9600);
  dht.begin();
}

void loop()
{
  float tempaussen = dht.readTemperature(); //Temperatur außen wird gemessen und gespeichert
  float feuchteaussen = dht.readHumidity(); //Luftfeuchte außen wird gemessen und gespeichert

  /*Senden der Messwerte mit Nachtwächterfunktion*/
    if (millis() - BT_timestore > 10000)   //Wenn 10 Sek. seit dem letzten Loopdurchlauf vergangen sind, dann senden
    {
        //Senden der Messwerte
    btSerial << Temperatur << ',' << tempaussen << ';' << endl;

    btSerial << Feuchtigkeit << ',' << feuchteaussen << ';' << endl;
   
    Serial.println(tempaussen);
    Serial.println(feuchteaussen);
    BT_timestore = millis();
    }

//Löschen der Messwerte
   tempaussen = 0;     //Der Wert für Temperatur wird genullt
   feuchteaussen = 0;  //Der Wert für Feuchte wird für die nächste Runde genullt
}


Falls jemand den Sketch noch sinnvoll weiter tunen kann, fänd ich interessant.

wno158

Da hätte ich nur eine Anregung zum Tunen:
In jedem, wirklich jedem, loop()-Aufruf liest Du Temperatur und Feuchtigkeit aus.
Die Mehrzahl davon verschwindet aber im Nirwana, weil sinnvollerweise das Senden nur alle 10s erfolgt.

Wie das geht, kannst Du aber leicht selbst herausfinden - deshalb kein Code.
Gruß Walter

adruinoboy

Du meinst also, dass ich das Auslesen der Temp. und Feuchtigkeit auch in die if(millis)-Bedingung schreiben soll.
Perfekt danke. Auf die Idee bin ich nicht gekommen.
Ist wirklich nur eine kleine Änderung, aber total sinnvoll.

Danke

Go Up