Skip to content

Need help installing  #1

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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