ARDUINO BLUETOOTH

Een goede vriend is handig met elektronica. Hij kan met een vette schakeling zijn tuinhek op afstand open en dicht doen. Dit gaat met een of andere RF schakeling van Conrad geloof ik. Het probleem is echter dat de afstandbediening niet altijd krachtig genoeg is zodat je ook echt zeker weet of het hek nu ook echt in het slot gevallen is. Het idee is tijdens een verjaardag geloof ik vorig jaar ontstaan om hier iets voor te maken. Het idee is als volgt:

Er zijn twee modules nodig:

Een zender met 3 fysieke schakelaars Een ontvanger met een display o.i.d. waarop je de status kunt zien van de 3 schakelaars Het idee is verder vrij eenvoudig, als een van de schakelaars niet is gesloten dan moet er een melding komen op het display, en er moet een ledje gaan knipperen ofzo.

In eerste instantie had ik dit gemaakt met goedkope rf modules die op 433 mhz werken.

Dit werkte op zich prima, totdat ik de zend en ontvangst module verder dan 4 meter uit elkaar hield. De data kwam niet meer lekker over. Na flink wat gepruts met externe antennes kreeg ik het niet lekker aan de praat. Ik dacht dat ik door het vele gerommel aan de module’s er zeker wel eentje gesloopt had en besloot een nieuw setje te kopen. Echter weer met hetzelfde resultaat. TROEP dus.

Ik ben deze week opnieuw begonnen, en heb alle oude spullen in de container gegooid. Voor de nieuwe setup gebruik ik nu twee bluetooth modules. De HC05 en de HC06. Qua prijs zijn ze niet veel duurder, maar ik heb er nu zeker al een afstand van meer dan 5 meter weten te overbruggen.

De setup is vrij eenvoudig, de 5v komt rechtstreeks van de arduino pro mini’s af in mijn geval, en de RX pinnetjes moeten met wel met twee weerstanden op de arduino aangesloten worden (voltage divider). Ik gebruik de HC05 als zend module, en de HC06 als ontvangst module.

Om de HC05 in een soort setup mode te krijgen moet er 3.3 volt op pin 34 komen. Als alles gekoppeld is, kun je dit weer verwijderen.

Om het geheel aan de praat te krijgen moet je de twee modules pairen. Dit heb ik als volgt gedaan. Op de HC05 (verzend module) kun je onderstaande sketch uploaden

#include
SoftwareSerial BTserial(2, 3); // RX | TX
// Connect the HC-05 TX to Arduino pin 2 RX.
// Connect the HC-05 RX to Arduino pin 3 TX through a voltage divider.

char c = ' ';

void setup()
{
// start th serial communication with the host computer
Serial.begin(9600);
Serial.println("Arduino with HC-05 is ready");

// start communication with the HC-05 using 38400
BTserial.begin(38400);
Serial.println("BTserial started at 38400");
}

void loop()
{

// Keep reading from HC-05 and send to Arduino Serial Monitor
if (BTserial.available())
{
c = BTserial.read();
Serial.write(c);
}

// Keep reading from Arduino Serial Monitor and send to HC-05
if (Serial.available())
{
c = Serial.read();

// mirror the commands back to the serial monitor
// makes it easy to follow the commands
Serial.write(c);
BTserial.write(c);
}

}

Als je de serial monitor opstart en AT ingeeft, moet de module OK aangeven.

Op de HC06 heb ik onderstaande sketch gezet:

#include <SoftwareSerial.h>
SoftwareSerial BTSerial(2, 3); // RX | TX

void setup() 
{
    Serial.begin(9600);
    Serial.println("Arduino with HC-06 is ready");

    // HC-06 default baud rate is 9600
    BTSerial.begin(9600);  
    Serial.println("BTserial started at 9600");
}

void loop()
{

  // Keep reading from HC-06 and send to Arduino Serial Monitor
  if (BTSerial.available())
    Serial.write(BTSerial.read());

  // Keep reading from Arduino Serial Monitor and send to HC-06
  if (Serial.available())
  BTSerial.write(Serial.read());
}

De HC06 module werkt iets anders dan de HC05. Voor de HC06 moet je de seriele monitor op ‘No line ending’ zetten. Geen idee waarom, maar anders werkt het niet. Ook als je hier weer AT verstuurd zou je OK terug moeten krijgen.

Op de HC06 moet je een pincode in de module zetten welke overeenkomt met de HC05. Dit doe je door AT+PSWD1234 te versturen, waarbij 1234 dan de pincode is natuurlijk. Pas dit aan naar wat anders.

De HC06 is nu klaar, en kan gepaired worden door een andere module zolang de pincode maar gelijk is.

Sluit nu dan weer de HC05 aan, en verstuur dan AT+PIN1234 hiervoor moet je dus PIN versturen in plaats van PSWD. Lekker verwarrend ook. Ok. Tijd voor een kopje koffie.

KOPPELEN VAN DE HC05 AAN DE HC06

Ok, nu dan het echte werk. De pincode op beide modules moet gelijk zijn, net zoals de baudrate. Op de HC05 moet op pin 34 3,3 volt staan, anders gaat er niks werken.

Verstuur onderstaande naar de HC05

AT+RMAAD AT+ROLE=1 AT+RESET AT+CMODE=0 AT+INQM=0,5,9 AT+INIT AT+INQ

Na maximaal 9 sec. zou je een soort adres in beeld moeten krijgen. Bijvoorbeeld:

+INQ:3014:10:171179,1F00,7FFF

Je kunt met het RNAME commando de naam van de bluetooth module opvragen als je meer dan 1 resultaat hebt. Het rare is dan ook weer dat het adres stopt bij de eerste komma, en dat je de dubbele punten moet vervangen door een komma. Het commando wordt dan:

AT+RNAME?3014,10,171179

Als je de juiste module hebt te pakken kun je deze pairen met dit commando. Let op dat er na het adres een ,9 staat. Dit betekent 9 sec. timeout.

AT+PAIR=3014,10,171179,9

Na het pairen moet er een OK komen. Hierna kun je de modules aan elkaar binden met:

AT+BIND=3014,10,171179

Hierna zetten we de HC05 weer in de modes dat hij alleen met gepairde modules connect met:

AT+CMODE=1

Hierna linken we de twee modules aan elkaar met:

AT+LINK=3014,10,171179

Als alles is goed gegaan knippert de HC05 twee keer snel achter elkaar. De HC06 brand altijd. Als je de spanning van de modules af haalt, en er weer op zet, zou de verbinding weer automatisch moeten herstellen. Soms kan dit een paar seconden duren heb ik gemerkt.

Voor het versturen van data van de ene module naar de andere gebruik ik EasyTransfer. Met deze library is het makkelijk om een data set aan te maken, deze te vullen en serieel te versturen. Je hoeft nergens over na te denken, het werkt gewoon. Altijd lekker 😉

Voor de verzend module gebruik ik deze code:

#include <SoftEasyTransfer.h>
#include <SoftwareSerial.h>
#include <DHT11.h>
DHT11 dht11(4); // Pin for DHT11

SoftwareSerial BTserial(2, 3); // RX | TX
SoftEasyTransfer ET; 

struct SEND_DATA_STRUCTURE{
  int switch1;
  int switch2;
  int switch3;
  int alarm;
  float humi;
  float temp;
};

SEND_DATA_STRUCTURE mydata;

void setup() 
{
    //Serial.begin(9600);
    BTserial.begin(9600);
    ET.begin(details(mydata), &BTserial);
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    pinMode(10, INPUT_PULLUP);
    pinMode(11, INPUT_PULLUP);
    pinMode(12, INPUT_PULLUP);
    pinMode(13, OUTPUT);
}

void loop()
{
    mydata.switch1 = digitalRead(10);
    mydata.switch2 = digitalRead(11);
    mydata.switch3 = digitalRead(12);
    dht11.read(mydata.humi, mydata.temp);

    if ((mydata.switch1 == 1) && (mydata.switch2 == 1) && (mydata.switch3 == 1))
    {
      // everything closed, OK
      digitalWrite(5, LOW);
      digitalWrite(6, HIGH);
      mydata.alarm = 0;
    }
    else
    {
      // something open, NOT OK
      digitalWrite(5, HIGH);
      digitalWrite(6, LOW);
      mydata.alarm = 1;
    }
    ET.sendData();
    digitalWrite(13, HIGH);
    delay(100);
    digitalWrite(13, LOW);
    delay(1900);
}

Voor de ontvangst module deze sketch:

#include <SoftwareSerial.h>
#include <SoftEasyTransfer.h>

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

SoftwareSerial BTSerial(2, 3); // RX | TX

SoftEasyTransfer ET; 

int iTemp;
int iHumi;
int errorcount;

struct RECEIVE_DATA_STRUCTURE{
  int switch1;
  int switch2;
  int switch3;
  int alarm;
  float humi;
  float temp;
};

RECEIVE_DATA_STRUCTURE mydata;

void setup() 
{
    Serial.begin(9600);
    BTSerial.begin(9600);  
    ET.begin(details(mydata), &BTSerial);
    pinMode(13, OUTPUT);
    pinMode(12, OUTPUT); // error lampje
    display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)
    display.clearDisplay();
    display.display();
    errorcount = 0;
}

void loop()
{

  if(ET.receiveData()){
    errorcount = 0;

    digitalWrite(13, HIGH);
    delay(100);
    digitalWrite(13, LOW);
    delay(100);

    iTemp = (int) mydata.temp;
    iHumi = (int) mydata.humi;

    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0,0);

    if(mydata.alarm == 0){
        digitalWrite(12, LOW);
        display.println("OK!");
    }
    else{
        digitalWrite(12, HIGH);
        display.println("HEK OPEN!");
    }

    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0,20);

    if(mydata.switch1 == 0){
        display.setTextColor(BLACK, WHITE);
        display.println("Schakelaar 1: Open");
    }
    else{
        display.setTextColor(WHITE);
        display.println("Schakelaar 1: Dicht");
    }

    display.setCursor(0,30);

    if(mydata.switch2 == 0){
        display.setTextColor(BLACK, WHITE);
        display.println("Schakelaar 2: Open");
    }
    else{
        display.setTextColor(WHITE);
        display.println("Schakelaar 2: Dicht");
    }

    display.setCursor(0,40);

    if(mydata.switch3 == 0){
        display.setTextColor(BLACK, WHITE);
        display.println("Schakelaar 3: Open");
    }
    else{
        display.setTextColor(WHITE);
        display.println("Schakelaar 3: Dicht");
    }
    display.setTextColor(WHITE);
    display.setCursor(0,50);
    display.print("T:");
    display.print(iTemp);
    display.print((char)247);

    display.print(" H:");
    display.print(iHumi);
    display.print("%");
  }
  else{
    errorcount = errorcount + 1;
  }

Serial.println(errorcount);

  if(errorcount > 10){
    digitalWrite(12, HIGH);
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0,0);
    display.println("OOPS!");
    display.setTextSize(1);
    display.setCursor(0,20);
    display.println("Geen verbinding!");
    display.setCursor(0,30);
    display.print("Al ");
    display.print(errorcount);
    display.print(" x mislukt");
  }

  display.display();
  delay(1000);
  //display.clearDisplay();

}

Het is allemaal WIP, dus het zal nog wel een aantal keer veranderen.

ZWAVE ADAPTER IN DOMOTICZ

Na een tijd met de RFXCom module gewerkt te hebben, komen er zo nu en dan wat haperingen naar boven. Sommige KaKu modules ontvangen niet altijd het signaal om aan of uit te schakelen. Dit is natuurlijk erg irritant, vooral als het donker is, en je verwacht dat het licht automagisch aan zal schakelen.

Via het domoticz forum las ik een tijd geleden al dat er ook zoiets was als zwave. Het voordeel van dit systeem is dat de modules onderling met elkaar een netwerk opbouwen om zo informatie door te geven (mesh). Ook is zwave bidirectioneel, wat er voor zorgt als je de schakelaar zelf uitzet met een fysieke schakelaar dat uiteindelijk domoticz dit ook weet. Ik zag op internet allerlei berichten dat er nog een openzwave gecompileerd moest worden op de raspberry welke ik gebruik, en dit heeft me tegen gehouden om over te stappen.

Uiteindelijk werkte de KaKu schakeling vorige week weer niet helemaal, en ik dacht er meteen aan om dan nu maar eens over te stappen naar de jongens van zwave. Op maandag een zwave usb stick gekocht inclusief 2 smartplugs, en een inbouw qubino module.

Image Title

Op maandag dus besteld, en dit pakketje werd dinsdag al afgeleverd! Tijd om uit te pakken en te beginnen!

Ik prikte als eerst de usb stick in mijn raspberry. Ik wilde zeker weten dat zonder enig gecompileer het ook echt niet zou werken. En tot mijn grote verbazing zag ik een extra usb device op de raspberry! Op internet zag ik dat mensen zochten naar /dev/TTYUSB0 in mijn geval kreeg ik een /dev/ttyACM0 erbij. Deze hardware aangemaakt in domoticz als type OpenZWave USB, en ineens leek het snel goed te komen!

Het includen van een device was even zoeken hoe dat precies moest, maar na de handleiding van de usb stick te hebben gelezen was dat ook niet heel erg moeilijk. Als eerste heb ik de usb stick weer uit de raspberry getrokken. In de usb stick zit een batterij welke ervoor zorgt dat je ook kort bij een device deze kunt includen. Als je de knop op de usb stick indrukt gaat de led blauw knipperen. Tijdens dit geknipper druk je simpelweg op de smartplug connect button, en hij is geinclude. Later heb ik de andere devices via domoticz toegevoegd. Dit kan ook erg makkelijk via het knopje Sensor opnemen.

Node include

Later heb ik voor de GreenWave modules polling aangezet. Als de modules 2 minuten geen verbinding hebben gehad met domoticz gaan ze groen knipperen. Door de polling op 60sec. te zetten komt dit dus niet voor, en als ze wel gaan knipperen is domoticz kapot, of er is iets anders aan de hand.

Het grappige van de GreenWave modules is dat ze naast een simpele aan/uit schakelaar ook het opgenomen vermogen rapporteren aan domoticz. Hierdoor krijg je een inzicht in wat mijn PC ongeveer gebruikt, en later op de dag de 3D printer.