Skip to content

Commit

Permalink
Esp32 compatibility (#145)
Browse files Browse the repository at this point in the history
* esp32 init

* RF gateway ok with ESP32

* correct IR gateway compilation errors and test RF2 ok

* divide config per board type

* update test file according user_config

* differentiate variable type following IR libraries aka platforms

* implement BLE beacons detection with ESP32

* Implement multitasking on BLE gateway

* Library add and change core assignement

* change core assignement for BLE

* add mi flora value readings with ESP32

* adding some traces and removing unecessary comment

* correct compilation error due to pin assignement

* correct temperature float value and wrong mac adress rssi publishing

* add esp32 to CI

* correct esp32 ide retrieving

* correcting paths

* CI: correct architecture
* libraries update (irremote) and overwrite ble library files
  • Loading branch information
1technophile authored Jan 1, 2018
1 parent 15cea6b commit 7c6e0cc
Show file tree
Hide file tree
Showing 19 changed files with 319 additions and 101 deletions.
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,6 @@
[submodule "libraries/NewRemoteSwitch"]
path = libraries/NewRemoteSwitch
url = https://github.com/1technophile/NewRemoteSwitch
[submodule "libraries/ESP32_BLE_Arduino"]
path = libraries/ESP32_BLE_Arduino
url = git://github.com/nkolban/ESP32_BLE_Arduino.git
18 changes: 14 additions & 4 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,20 @@ env:
- BD=arduino:avr:mega:cpu=atmega2560
- BD=esp8266:esp8266:nodemcuv2:CpuFrequency=80,FlashSize=4M3M
- BD=esp8266:esp8266:d1_mini:CpuFrequency=80,FlashSize=4M3M
- BD=espressif:esp32:esp32doit-devkit-v1:FlashFreq=80
before_install:
- "/sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_1.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :1 -ac -screen 0 1280x1024x16"
- sleep 3
- export DISPLAY=:1.0
- wget http://downloads.arduino.cc/arduino-1.8.2-linux64.tar.xz
- tar xf arduino-1.8.2-linux64.tar.xz
- sudo mv arduino-1.8.2 /usr/local/share/arduino
- wget http://downloads.arduino.cc/arduino-1.8.5-linux64.tar.xz
- tar xf arduino-1.8.5-linux64.tar.xz
- sudo mv arduino-1.8.5 /usr/local/share/arduino
- sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino
install:
- ln -s $PWD /usr/local/share/arduino/OpenMQTTGateway
- rm /usr/local/share/arduino/OpenMQTTGateway/User_config.h
- cp /usr/local/share/arduino/OpenMQTTGateway/tests/Test_config.h /usr/local/share/arduino/OpenMQTTGateway/User_config.h
- wget https://github.com/z3t0/Arduino-IRremote/archive/2.1.0.zip -O /tmp/IRremote.zip
- wget https://github.com/z3t0/Arduino-IRremote/archive/v2.4.0.zip -O /tmp/IRremote.zip
- unzip /tmp/IRremote.zip -d /usr/local/share/arduino/libraries
- rm -rf /usr/local/share/arduino/libraries/RobotIRremote
- wget https://github.com/markszabo/IRremoteESP8266/archive/v2.2.0.zip -O /tmp/IRremoteESP8266.zip
Expand All @@ -37,6 +38,15 @@ install:
- git clone https://github.com/LowPowerLab/RFM69 /usr/local/share/arduino/libraries/RFM69
- rm /usr/local/share/arduino/libraries/RFM69/RFM69_OTA.h
- rm /usr/local/share/arduino/libraries/RFM69/RFM69_OTA.cpp
- git clone https://github.com/nkolban/ESP32_BLE_Arduino /usr/local/share/arduino/libraries/ESP32_BLE_Arduino
- wget -q https://raw.githubusercontent.com/nkolban/esp32-snippets/master/cpp_utils/BLEAdvertisedDevice.cpp -O /usr/local/share/arduino/libraries/ESP32_BLE_Arduino/src/BLEAdvertisedDevice.cpp
- wget -q https://raw.githubusercontent.com/nkolban/esp32-snippets/master/cpp_utils/BLEAdvertisedDevice.h -O /usr/local/share/arduino/libraries/ESP32_BLE_Arduino/src/BLEAdvertisedDevice.h
- mkdir -p /usr/local/share/arduino/hardware/espressif
- cd /usr/local/share/arduino/hardware/espressif
- git clone https://github.com/espressif/arduino-esp32.git esp32
- cd esp32/tools/
- python get.py
- cd /usr/local/share/arduino/OpenMQTTGateway
- arduino --pref "boardsmanager.additional.urls=http://arduino.esp8266.com/stable/package_esp8266com_index.json" --save-prefs
- arduino --install-boards esp8266:esp8266
- arduino --board $BD --save-prefs
Expand Down
2 changes: 1 addition & 1 deletion OpenMQTTGateway.ino
Original file line number Diff line number Diff line change
Expand Up @@ -441,7 +441,7 @@ void extract_char(char * token_char, char * subset, int start ,int l, boolean re
if (reverse) revert_hex_data(tmp_subset, tmp_subset2, l+1);
else strncpy( tmp_subset2, tmp_subset , l+1);
long long_value = strtoul(tmp_subset2, NULL, 16);
sprintf(tmp_subset2, "%d", long_value);
sprintf(tmp_subset2, "%ld", long_value);
strncpy( subset, tmp_subset2 , l+1);
}else{
if (reverse) revert_hex_data(tmp_subset, subset, l+1);
Expand Down
24 changes: 23 additions & 1 deletion User_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@

/*-------------DEFINE YOUR NETWORK PARAMETERS BELOW----------------*/
// Update these with values suitable for your network.
#ifdef ESP8266 // for nodemcu, weemos and esp8266
#if defined(ESP8266) || defined(ESP32) // for nodemcu, weemos and esp8266
#define wifi_ssid "wifi ssid"
#define wifi_password "wifi password"
#else // for arduino + W5100
Expand Down Expand Up @@ -100,6 +100,28 @@ const byte subnet[] = { 255, 255, 255, 0 }; //ip adress
//#include "config_DHT.h"
//#define ZgatewayRFM69 // If you uncomment this you can't use RF and BT due to the fact that RF use also D8 and BT use also D6/D7
//#include "config_RFM69.h"
#elif ESP32
#define ZgatewayRF
#include "config_RF.h"
#define ZgatewayRF2
#define ZgatewayIR
#include "config_IR.h"
//#define ZgatewayBT
//#include "config_BT.h"
//#define ZsensorINA226
//#include "config_INA226.h"
//#define ZsensorHCSR501
//#include "config_HCSR501.h"
//#define ZsensorADC
//#include "config_ADC.h"
//#define ZsensorBH1750
//#include "config_BH1750.h"
//#define ZsensorBME280
//#include "config_BME280.h"
//#define ZsensorDHT // If you uncomment this you can't use I2C due to the fact that I2C use also D1
//#include "config_DHT.h"
//#define ZgatewayRFM69 // If you uncomment this you can't use RF and BT due to the fact that RF use also D8 and BT use also D6/D7
//#include "config_RFM69.h"
#else // for arduino + W5100
#define ZgatewayRF
#include "config_RF.h"
Expand Down
249 changes: 180 additions & 69 deletions ZgatewayBT.ino
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,99 @@
Thanks to wolass https://github.com/wolass for suggesting me HM 10 and dinosd https://github.com/dinosd/BLE_PROXIMITY for inspiring me how to implement the gateway
*/
#ifdef ZgatewayBT

#ifdef ESP32
/*
Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleScan.cpp
Ported to Arduino ESP32 by Evandro Copercini
*/
// core task implementation thanks to https://techtutorialsx.com/2017/05/09/esp32-running-code-on-a-specific-core/

#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>

//core on which the BLE detection task will run
static int taskCore = 0;

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
void onResult(BLEAdvertisedDevice advertisedDevice) {
String mac_adress = advertisedDevice.getAddress().toString().c_str();
mac_adress.replace(":","");
mac_adress.toUpperCase();
String mactopic = subjectBTtoMQTT + mac_adress;
if (advertisedDevice.haveName()){
String nameBLE = advertisedDevice.getName().c_str();
trc(mactopic + " " + nameBLE);
client.publish((char *)(mactopic + "/name").c_str(),(char *)nameBLE.c_str());
}
String rssi = String(advertisedDevice.getRSSI());
trc(mactopic + " " + rssi);
client.publish((char *)mactopic.c_str(),(char *)rssi.c_str());

if (advertisedDevice.haveServiceData()){
trc(F("Get service data "));
std::string serviceData = advertisedDevice.getServiceData();
int serviceDataLength = serviceData.length();
String returnedString = "";
for (int i=0; i<serviceDataLength; i++)
{
int a = serviceData[i];
if (a < 16) {
returnedString = returnedString + "0";
}
returnedString = returnedString + String(a,HEX);
}
trc(returnedString);

trc(F("Get service data UUID"));
BLEUUID serviceDataUUID = advertisedDevice.getServiceDataUUID();
trc(serviceDataUUID.toString().c_str());

if (strstr(serviceDataUUID.toString().c_str(),"fe95") != NULL){
trc("Processing mi flora data");
char service_data[returnedString.length()+1];
returnedString.toCharArray(service_data,returnedString.length()+1);
service_data[returnedString.length()] = '\0';
char mac[mac_adress.length()+1];
mac_adress.toCharArray(mac,mac_adress.length()+1);
boolean result = process_miflora_data(-22,service_data,mac);
}
}
}
};

void setupBT(){
// we setup a task with priority one to avoid conflict with other gateways
xTaskCreatePinnedToCore(
coreTask, /* Function to implement the task */
"coreTask", /* Name of the task */
10000, /* Stack size in words */
NULL, /* Task input parameter */
1, /* Priority of the task */
NULL, /* Task handle. */
taskCore); /* Core where the task should run */
}

void coreTask( void * pvParameters ){

String taskMessage = "BT Task running on core ";
taskMessage = taskMessage + xPortGetCoreID();

while(true){
trc(taskMessage);
delay(TimeBtw_Read);
BLEDevice::init("");
BLEScan* pBLEScan = BLEDevice::getScan(); //create new scan
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
BLEScanResults foundDevices = pBLEScan->start(Scan_duration);
}
}

#else // arduino or ESP8266 working with HM10/11

#include <SoftwareSerial.h>

#define STRING_MSG "OK+DISC:"
Expand Down Expand Up @@ -67,40 +160,43 @@ boolean BTtoMQTT() {

if (millis() > (timebt + TimeBtw_Read)) {//retriving data
timebt = millis();
#ifdef ESP8266
#if defined(ESP8266)
yield();
#endif
if (returnedString != "") {
size_t pos = 0;
while ((pos = returnedString.lastIndexOf(delimiter)) != -1) {
#ifdef ESP8266
#if defined(ESP8266)
yield();
#endif
String token = returnedString.substring(pos);
trc(token);
returnedString.remove(pos,returnedString.length() );
char token_char[token.length()+1];
token.toCharArray(token_char, token.length()+1);

for(int i =0; i<6;i++)
{
extract_char(token_char,d[i].extract,d[i].start, d[i].len ,d[i].reverse, false);
if (i == 3) d[5].len = (int)strtol(d[i].extract, NULL, 16) * 2; // extracting the length of the rest data
}

if((strlen(d[0].extract)) == 12) // if a mac adress is detected we publish it
{
strupp(d[0].extract);
String mactopic(d[0].extract);
trc(mactopic);
mactopic = subjectBTtoMQTT + mactopic;
int rssi = (int)strtol(d[2].extract, NULL, 16) - 256;
char val[12];
sprintf(val, "%d", rssi);
client.publish((char *)mactopic.c_str(),val);
if (strcmp(d[4].extract, "fe95") == 0)
boolean result = process_miflora_data(d[5].extract,d[0].extract);

return true;
trc(token);
if ( token.length() > 60){// we extract data only if we have detailled infos
for(int i =0; i<6;i++)
{
extract_char(token_char,d[i].extract,d[i].start, d[i].len ,d[i].reverse, false);
if (i == 3) d[5].len = (int)strtol(d[i].extract, NULL, 16) * 2; // extracting the length of the rest data
}

if((strlen(d[0].extract)) == 12) // if a mac adress is detected we publish it
{
strupp(d[0].extract);
String mactopic(d[0].extract);
trc(mactopic);
mactopic = subjectBTtoMQTT + mactopic;
int rssi = (int)strtol(d[2].extract, NULL, 16) - 256;
char val[12];
sprintf(val, "%d", rssi);
client.publish((char *)mactopic.c_str(),val);
if (strcmp(d[4].extract, "fe95") == 0)
boolean result = process_miflora_data(0,d[5].extract,d[0].extract);

return true;
}
}
}
returnedString = ""; //init data string
Expand All @@ -119,56 +215,13 @@ void strupp(char* beg)
++beg;
}

boolean process_miflora_data(char * rest_data, char * mac_adress){

char tmp_rest_data_length[1];
memcpy( tmp_rest_data_length, &rest_data[51], 1 );
int data_length = ((int)strtol(tmp_rest_data_length, NULL, 16)*2)+1;
char rev_data[data_length];
char data[data_length];
memcpy( rev_data, &rest_data[52], data_length );
rev_data[data_length] = '\0';

// reverse data order
revert_hex_data(rev_data, data, data_length);
int value = strtol(data, NULL, 16);
char val[12];
sprintf(val, "%d", value);
String mactopic(mac_adress);
mactopic = subjectBTtoMQTT + mactopic;


// following the value of digit 47 we determine the type of data we get from the sensor
switch (rest_data[47]) {
case '9' :
mactopic = mactopic + "/" + "fer";
break;
case '4' :
mactopic = mactopic + "/" + "tem";
dtostrf(value/10,4,1,val); // override temperature value in case we have, indeed temp has to be divided by 10
break;
case '7' :
mactopic = mactopic + "/" + "lux";
break;
case '8' :
mactopic = mactopic + "/" + "hum";
break;
default:
trc("can't read values");
return false;
}
client.publish((char *)mactopic.c_str(),val);;
trc(String(val));
return true;
}

#endif

#ifndef ZgatewayBT_v6xx
#define QUESTION_MSG "AT+DISI?"
boolean BTtoMQTT() {
while (softserial.available() > 0) {
#ifdef ESP8266
#if defined(ESP8266)
yield();
#endif
String discResult = softserial.readString();
Expand All @@ -178,7 +231,7 @@ boolean BTtoMQTT() {
float device_number = discResult.length()/78.0;
if (device_number == (int)device_number){ // to avoid publishing partial values we detect if the serial data has been fully read = a multiple of 78
trc(F("Sending BT data to MQTT"));
#ifdef ESP8266
#if defined(ESP8266)
yield();
#endif
for (int i=0;i<(int)device_number;i++){
Expand All @@ -201,7 +254,7 @@ boolean BTtoMQTT() {
}
if (millis() > (timebt + TimeBtw_Read)) {//retriving value of adresses and rssi
timebt = millis();
#ifdef ESP8266
#if defined(ESP8266)
yield();
#endif
softserial.print(F(QUESTION_MSG));
Expand All @@ -211,3 +264,61 @@ boolean BTtoMQTT() {
}
#endif
#endif

boolean process_miflora_data(int offset, char * rest_data, char * mac_adress){

int data_length = 0;
switch (rest_data[51 + offset]) {
case '1' :
case '2' :
case '3' :
case '4' :
data_length = ((rest_data[51 + offset] - '0') * 2)+1;
trc(String(data_length));
break;
default:
trc("can't read data_length");
return false;
}

char rev_data[data_length];
char data[data_length];
memcpy( rev_data, &rest_data[52 + offset], data_length );
rev_data[data_length] = '\0';

// reverse data order
revert_hex_data(rev_data, data, data_length);
double value = strtol(data, NULL, 16);
trc(String(value));
char val[12];
String mactopic(mac_adress);
mactopic = subjectBTtoMQTT + mactopic;

// following the value of digit 47 we determine the type of data we get from the sensor
switch (rest_data[47 + offset]) {
case '9' :
mactopic = mactopic + "/" + "fer";
dtostrf(value,0,0,val);
break;
case '4' :
mactopic = mactopic + "/" + "tem";
dtostrf(value/10,3,1,val); // temp has to be divided by 10
break;
case '7' :
mactopic = mactopic + "/" + "lux";
dtostrf(value,0,0,val);
break;
case '8' :
mactopic = mactopic + "/" + "hum";
dtostrf(value,0,0,val);
break;
default:
trc("can't read values");
return false;
}
client.publish((char *)mactopic.c_str(),val);;
trc(String(val));
return true;
}

#endif
Loading

0 comments on commit 7c6e0cc

Please sign in to comment.