Skip to content

Need help installing  #1

@happytm

Description

@happytm

Great project. I am new to linux and I need little help to install your software. I Have raspberry pi zero. I have little home automation project where I have few ESP8266 clients. My project require to collect Mac ID of these ESP devices in raspberry pi to further process in RPIEasy home automation software https://github.com/enesbcs/rpieasy . I took inspiration for this project from here HarringayMakerSpace/sonoff-adhoc#1 . client code is below:

This sketch uses IRremoteESP8266 library from https://github.com/crankyoldgit/IRremoteESP8266.
In order to send MIDEA protocol IR message there is change needed in library
as documented here : https://github.com/crankyoldgit/IRremoteESP8266/issues/887#issuecomment-531314986
Change this line: https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/IRrecv.h#L402
to:
                   bool strict = false);
e.g.
#if DECODE_MIDEA
  bool decodeMidea(decode_results *results, uint16_t nbits = kMideaBits,
                   bool strict = true);
#endif
On receiver side example can be used from here: https://github.com/happytm/BatteryNode/blob/master/Double%20Receiver/Double_Receiver.ino
*/
#define IRSENDER              true
#define PROBEREQUESTER        true
#define SLEEP_SECS 15 * 60 // 15 minutes
int device = 1;

#if PROBEREQUESTER
#include <ESP8266WiFi.h>


#endif

//============Do not need user configuration from here on============================

 
#if IRSENDER
#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>
//#include <IRrecv.h>
//#include <IRutils.h>
#endif

#include "SparkFunBME280.h"

ADC_MODE(ADC_VCC); //vcc read-mode

BME280 bme280;




int apChannel = 7;
int temperature = 10;
int humidity = 20;
int pressure = 30;
int voltage = 40;
int light = 50; 

uint8_t irMac[] = {temperature, humidity, pressure, voltage, light, device}; 

int VOLT_LIMIT = 3;
unsigned long lastMillis;
unsigned long passedMillis;
int ledPin = 12;

  

/*
//==============================Probe Request defines starts=======================  
extern "C" void preinit() {
    
   // Change MAC 
    uint8_t mac[6];
    mac[0] = temperature;
    mac[1] = humidity;
    mac[2] = pressure;
    mac[3] = Voltage;
    mac[4] = light;
    mac[5] = device;
  
  
  wifi_set_opmode (STATION_MODE);
  wifi_set_macaddr(STATION_IF, irMac);
}
//==============================Probe Request defines ends=======================  
*/

//====================IR defines starts============================

#if IRSENDER
const uint16_t kIrLed = 16;  // ESP8266 GPIO pin to use. Recommended: 4 (D2).
IRsend irsend(kIrLed);  // Set the GPIO to be used to sending the message.

// Example Samsung A/C state captured from IRrecvDumpV2.ino
//uint8_t myMac[kSamsungAcStateLength] = {temperature, humidity, pressure, Voltage, light, device}; //{0xb4, 0xe6, 0x52, 0x44, 0x86, 0xad, 0xb4, 0xe6, 0x52, 0x44, 0x86, 0xad };
//uint64_t myMac = 0x1234567890AB;//{temperature, humidity, pressure, battery, lux, device};  // 48bits 
uint64_t myMac = 
    (uint64_t)(uint8_t (irMac[5])) | 
    (uint64_t)(uint8_t (irMac[4])) << 8 |          
    (uint64_t)(uint8_t (irMac[3])) << 16 |          
    (uint64_t)(uint8_t (irMac[2])) << 24 |          
    (uint64_t)(uint8_t (irMac[1])) << 32 |          
    (uint64_t)(uint8_t (irMac[0])) << 40;    
#endif
    
   
//====================IR defines ends==============================


void setup() {
    Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
    Serial.println();
    Serial.print("Milliseconds passed before setup: ");
    Serial.println(millis());
    lastMillis = millis();
    Serial.println();
    
    
    
    #if PROBEREQUESTER
    //WiFi.mode(WIFI_STA); // Station mode for esp-now controller
  //   wifi_set_opmode (STATION_MODE);
    wifi_set_macaddr(STATION_IF, irMac);
    struct station_config stationConf;
    //stationConf.bssid_set = 1;  //need not check MAC address of AP
    WiFi.disconnect();
    WiFi.hostname("Livingroom");
    Serial.println();
    #endif
    
    
    
    float voltage = ESP.getVcc() / (float)1023; // * (float)1.07;
    Serial.print("Voltage: "); Serial.print(voltage); Serial.print("  Voltage Expected: "); Serial.println(VOLT_LIMIT);
    if (voltage < VOLT_LIMIT)      // if voltage of battery gets to low, the LED wil blink fast.
  {
    Serial.println("Warning :- Battery Voltage low please change batteries" );
    Serial.println();
  }
    
    Serial.println("Setup finished");
    
    
    passedMillis = millis() - lastMillis;
    Serial.print("Time spent on setup: "); 
    Serial.println(passedMillis);
    Serial.println();
    lastMillis = millis();

    readBME280();
    Serial.println();
    
    #if PROBEREQUESTER
   probeRequest();
    #endif
    
    #if IRSENDER
    irsend.begin();
    irSender();
    #endif

}

//========================Main Loop================================

void loop() {

//===========================IR loop===============================
  #if IRSENDER
  //irSender();
  #endif
 //=====================Probe request Loop=========================
  
// put your code here to run in loop or move to setup to run oncce.
 
 #if PROBEREQUESTER
 probeRequest();
 #endif
 
 //readBME280();
  


 Serial.print("Total time I spent before going to sleep: "); 
 Serial.println(millis());
 Serial.print("I will wakeup in: "); 
 Serial.print(SLEEP_SECS / 60); 
 Serial.println(" Minutes"); 
 delay(20000);
 ESP.restart(); 
//ESP.deepSleep(0);
 
    
}

//=========================Main Loop ends==========================






void readBME280() {
  bme280.settings.commInterface = I2C_MODE;
  bme280.settings.I2CAddress = 0x76;
  bme280.settings.runMode = 2; // Forced mode with deepSleep
  bme280.settings.tempOverSample = 1;
  bme280.settings.pressOverSample = 1;
  bme280.settings.humidOverSample = 1;
  Serial.print("bme280 init="); Serial.println(bme280.begin(), HEX);
  temperature = 25;//bme280.readTempC();
  humidity = bme280.readFloatHumidity();
  pressure = bme280.readFloatPressure() / 100.0;
  delay(10);
  passedMillis = millis() - lastMillis;
  Serial.print("Time spent on BME280: "); 
  Serial.println(passedMillis);
  Serial.println();
}



void gotoSleep() {                            //need connection between GPIO16 and reset pin on ESP8266
  // add some randomness to avoid collisions with multiple devices
  int sleepSecs = SLEEP_SECS;// + ((uint8_t)RANDOM_REG32/2);
  Serial.printf("Up for %i ms, going to sleep for %i secs...\n", millis(), sleepSecs);
  ESP.deepSleep(sleepSecs * 1000000, RF_NO_CAL);
}

#if PROBEREQUESTER
//=========================Probe request function starts===========
  
  void probeRequest()  {
  Serial.println("Starting Probe sender");
  Serial.println("Sending sensor data over Probe request protocol to Master Node");
  Serial.println();
 

//WiFi.scanNetworksAsync(prinScanResult);

//int8_t scanNetworks(bool async = true, bool show_hidden = false, uint8 channel = 0, uint8* ssid = NULL);
int n = WiFi.scanNetworks(true, true, apChannel); // find solution for san for specific ssid instead of channel.

#if !IRSENDER
delay(25); // Minimum delay required to scan networks in async mode if not using IRSENDER 
#endif

#if IRSENDER
delay(10);     // Minimum delay required to scan networks in async mode if using IRSENDER              
#endif

 if (WiFi.BSSIDstr(0)[16] == '1')  {
 String ssid;
 Serial.println();
 Serial.print("This Device MAC ID is: ");
 Serial.println(WiFi.macAddress());
 Serial.print("This Device Name is: ");
 Serial.println(WiFi.hostname());
 Serial.print("Message received from Controller is: ");
 Serial.println(&WiFi.BSSIDstr(0)[0]);
 Serial.println(WiFi.BSSIDstr(0)[0]);
 Serial.println(WiFi.BSSIDstr(0)[1]);
 Serial.println(WiFi.BSSIDstr(0)[2]);
 Serial.println(WiFi.BSSIDstr(0)[3]);
 Serial.println(WiFi.BSSIDstr(0)[4]);
 Serial.println(WiFi.BSSIDstr(0)[5]);
 Serial.println(WiFi.BSSIDstr(0)[6]);
 Serial.println(WiFi.BSSIDstr(0)[7]);
 Serial.println(WiFi.BSSIDstr(0)[8]);
 Serial.println(WiFi.BSSIDstr(0)[9]);
 Serial.println(WiFi.BSSIDstr(0)[10]);
 Serial.println(WiFi.BSSIDstr(0)[11]);
 Serial.println(WiFi.BSSIDstr(0)[12]);
 Serial.println(WiFi.BSSIDstr(0)[13]);
 Serial.println(WiFi.BSSIDstr(0)[14]);
 Serial.println(WiFi.BSSIDstr(0)[15]);
 Serial.println(WiFi.BSSIDstr(0)[16]);
 
 Serial.print("Gateway Name is: ");
 Serial.println(WiFi.SSID(0));
 Serial.print("Gateway Channel is: ");
 Serial.println(WiFi.channel(0));
 
 Serial.print("Message received from Controller: ");
 if (WiFi.BSSIDstr(0)[0] == '3')  {
       Serial.print("GPIO,");
       Serial.print(ledPin);
       Serial.print(",");
       Serial.print(WiFi.BSSIDstr(0)[15]);
    }
 }

 Serial.println();
 WiFi.scanDelete();
 passedMillis = millis() - lastMillis;
 Serial.print("Time spent on Probe Request: "); 
 Serial.println(passedMillis);
 lastMillis = millis();
 Serial.println();
 
 delay(10);


 
}

#endif

#if IRSENDER
//========================IR function starts=========================================
void irSender()   {
    
  Serial.println("Starting IR data sender");
  Serial.println("Sending sensor data over IR protocol to Master Node");
  Serial.println();
   //  irsend.sendSamsungAC(myMac);
   //irsend.sendMidea(hwaddr);
   irsend.sendMidea(myMac); 
   Serial.print("Message sent : ");
//   serialPrintUint64(myMac, HEX); //  
   Serial.println();
   
 
    passedMillis = millis() - lastMillis;
    Serial.print("Time spent on IR Sender: "); 
    Serial.println(passedMillis);
    lastMillis = millis();
    Serial.println();
    //delay(10);
}
#endif````

Thanks.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions