Hi I've installed a couple of Arduino-Mini + bluetooth slave transmitting data. One on header tank in the loft, one in a dehumidifier. Now I want a data logger to scan them and where I'm going is a Nano driving master HC-05 squirting serial data at a RPi.
The code below is from the Nano and it switches the master HC-05 between the slave addresses. It's a bit clunky on hardware and software because of the steps necessary to change the address. If anyone knows better ways please say.
Richard.
/*
Use HC-05 already configured Bluetooth master. Switch it between 2
slave addresses and receive data from each for about a minute.
Ardino output pins can switch the power to the HC-05 and the AT-ena
(pin-34) connection.
Initially used push-switch to trigger change to next state, that code
remains but now switching after set time.
*/
// Arduino Pins
const int led_red1 = 2;
const int led_red2 = 3;
const int led_red3 = 4;
const int led_red4 = 5;
const int swser_tx = 7;
const int swser_rx = 8;
const int hc05_at_ena = 9;
const int hc05_power = 10; // Low is power on.
const int sw1 = 11;
#define BT_On_ 0
#define BT_Off 1
#include <SoftwareSerial.h>
SoftwareSerial mySerial(swser_rx, swser_tx);
int state;
/* Action for this state
0 - go to At mode
1 - set new bind address
2 - read back bind address
3 - go to normal mode
4 - nothing, just let the data flow.
*/
char bt_addrs[2][20] = {"98D3,31,FC1743", // Loft
"98D3,31,FB19A7"}; // Dehumid
int ix_addrs = 0; // index to array of BT addreses
int next_state = 0; // trigger to go to next state
long count_in_state = 0; // (not used yet, to switch state after data received)
void setup()
{
pinMode(hc05_at_ena, OUTPUT);
pinMode(hc05_power , OUTPUT);
pinMode(led_red1 , OUTPUT);
pinMode(led_red2 , OUTPUT);
pinMode(sw1, INPUT_PULLUP);
Serial.begin(9600);
while (!Serial){;}
delay(500);
Serial.println("BT2 A");
mySerial.begin(9600);
state = 0;
digitalWrite(hc05_power, BT_Off);
digitalWrite(led_red1 ,0);
}
void loop()
{
// data both ways between serial and BT
while (mySerial.available())
{
Serial.write(mySerial.read());
digitalWrite(led_red2, 1);
digitalWrite(led_red2, 0);
}
while (Serial.available())
{
mySerial.write(Serial.read());
}
//-----end-of-serial-exchange------------
if (!digitalRead(sw1))
{
next_state = 1;
delay(500); // very crude debounce
}
if (next_state)
{
next_state = 0;
if (state == 0)
{
// Go into AT mode
// turn bt off
digitalWrite(hc05_power, BT_Off);
digitalWrite(led_red1 ,0);
delay(500);
// pin 34 high
digitalWrite(hc05_at_ena, 1);
delay(500);
// turn bt on
digitalWrite(hc05_power, BT_On_);
digitalWrite(led_red1 ,1);
delay(500);
//
mySerial.begin(38400);
delay(500);
state++;
mySerial.print("at+version\r\n");
}
else if (state == 1)
{
mySerial.print("at+bind=");
mySerial.print(bt_addrs[ix_addrs]);
mySerial.print("\r\n");
state++ ;
}
else if (state == 2)
{
mySerial.print("at+bind\r\n");
state++ ;
}
else if (state == 3)
{
// go to normal mode
// turn bt off
digitalWrite(hc05_power, BT_Off);
digitalWrite(led_red1 ,0);
delay(500);
// pin 34 low
digitalWrite(hc05_at_ena, 0);
delay(500);
// turn bt on
digitalWrite(hc05_power, BT_On_);
digitalWrite(led_red1 ,1);
delay(500);
//
mySerial.begin(9600);
delay(500);
state++ ;
}
else if (state == 4)
{
ix_addrs += 1;
ix_addrs %= 2;
state = 0;
}
count_in_state = 0;
Serial.print("State: ");
Serial.print(state);
Serial.print(" ix: ");
Serial.print(ix_addrs);
Serial.print(" ");
}
// auto-switch to next state
switch (state)
{
case 0:
if (count_in_state > 5000) {next_state = 1;}
break;
case 1:
if (count_in_state > 5000) {next_state = 1;}
break;
case 2:
if (count_in_state > 5000) {next_state = 1;}
break;
case 3:
if (count_in_state > 5000) {next_state = 1;}
break;
case 4:
if (count_in_state > 60000) {next_state = 1;}
break;
}
count_in_state++;
delay(1);
}