YUSEF1810batiana nacroghaishicham talsi
Published

The beehive of the future

A smart beehive that can keep the beekeeper in the know about everything related to the beehive and to the bees.

IntermediateShowcase (no instructions)24 hours491
The beehive of the future

Things used in this project

Hardware components

Arduino MKR Fox 1200
Arduino MKR Fox 1200
×1
DHT22 Temperature Sensor
DHT22 Temperature Sensor
×1
SparkFun Load Cell Amplifier - HX711
SparkFun Load Cell Amplifier - HX711
×1
Rechargeable Battery, 3.7 V
Rechargeable Battery, 3.7 V
×1
Solar Panel, 2.5 W
Solar Panel, 2.5 W
×1
Weight sensor
×1
Adafruit Waterproof DS18B20 Digital temperature sensor
Adafruit Waterproof DS18B20 Digital temperature sensor
×3

Software apps and online services

Arduino IDE
Arduino IDE
Sigfox
Sigfox
Windows 10
Microsoft Windows 10
Circuit Maker
CircuitMaker by Altium Circuit Maker
Ubidots
Ubidots

Hand tools and fabrication machines

Wire Stripper & Cutter, 18-10 AWG / 0.75-4mm² Capacity Wires
Wire Stripper & Cutter, 18-10 AWG / 0.75-4mm² Capacity Wires
Solder Wire, Lead Free
Solder Wire, Lead Free
Soldering iron (generic)
Soldering iron (generic)
Hot glue gun (generic)
Hot glue gun (generic)
Drill / Driver, Cordless
Drill / Driver, Cordless
Multitool, Screwdriver
Multitool, Screwdriver
Breadboard, 170 Pin
Breadboard, 170 Pin
Mastech MS8217 Autorange Digital Multimeter
Digilent Mastech MS8217 Autorange Digital Multimeter

Story

Read more

Schematics

System schematic

This is the design for our system, it shows how all items are linked

Code

ruche.ino

C/C++
This is the main code file for this project, it allows you to read the dat from the sensors, process it as needed, then send it to Sigfox
/*____________INCLUDE DES BIBLIOTHEQUES_________________________________________*/
/*------------------------------------------------------------------------------*/
#include <SigFox.h>
#include "DHT.h"
#include "HX711.h"
#include <OneWire.h>
#include "ArduinoLowPower.h"
/*------------------------------------------------------------------------------*/
/*______________________________________________________________________________*/

/*_____________STRUCTURE MESSAGE SIGFOX ET DATA_________________________________*/
/*------------------------------------------------------------------------------*/
byte data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
int dataTemp = 0;                      // BufferTemporaire
float h =0;
float t =0;                            // Temp et Hum DHT22
uint16_t temperatureDS18B20[3] = {0};  // Temp EXT 1 a 3
uint16_t poids = 0;
uint8_t batterie = 0;
uint8_t panneau = 0;

typedef struct __attribute__ ((packed)) sigfox_message {  
  uint16_t humidite_DHT22:10; // Humidite sur 10bits
  int16_t temp_DHT22:11;      // Temprature sur 11bits
  int16_t temp_OW_NUM1:11;    // Temprature sur 11bits
  int16_t temp_OW_NUM2:11;    // Temprature sur 11bits
  int16_t temp_OW_NUM3:11;    // Temprature sur 11bits
  int16_t poids:11;           // Poids sur 11bits
  uint8_t batterie:7;         // Tension Batterie sur 7bits
  uint8_t panneau:7;          // Tension Panneau sur 7bits
} SigfoxMessage; 
/*------------------------------------------------------------------------------*/
/*______________________________________________________________________________*/


 
/*____________DEFINE PIN AND REFERENCE__________________________________________*/
/*------------------------------------------------------------------------------*/
#define DHTPIN 2  
#define DHTTYPE DHT22  
#define VREF 4.2
#define PAUSE 40000
#define OFFSET 68455
#define DEBUG 1
/*------------------------------------------------------------------------------*/
/*______________________________________________________________________________*/



/*____________PRIVATE VARIABLES_________________________________________________*/
/*------------------------------------------------------------------------------*/
int DAT = 5;                    // Pin Data Capteur de Poids
int CLK = 4;                    // Pin Clock Capteur de Poids
float valeur = 0.0f;            // Valeur Poids
float tarage = 0;                // Variable Tarage du capteur
float valInt = 0;                // Valeur Intermediaire de Poids
const byte BROCHE_ONEWIRE = 3;  // Pin Capteur Temp
long int lastTime = 0;          // Variable utile au delai
uint8_t* ptr;                   // Pointeur affichage trame binaire

const byte SENSOR_ADDRESS_1[] = {0x28,0xA6,0x81,0x23,0x1C,0x19,0x01,0xFF};
const byte SENSOR_ADDRESS_2[] = {0x28,0x73,0x7B,0xF4,0x36,0x19,0x01,0xB2};
const byte SENSOR_ADDRESS_3[] = {0x28,0x17,0xE2,0x26,0x0,0x0,0x80,0x6C};
unsigned long intervalle = 40000; 
unsigned long previousMillis = 0;
/*------------------------------------------------------------------------------*/
/*______________________________________________________________________________*/



/*____________PRIVATE OBJECTS___________________________________________________*/
/*------------------------------------------------------------------------------*/
DHT dht(DHTPIN, DHTTYPE);
HX711 capteur;
OneWire ds(BROCHE_ONEWIRE);
SigfoxMessage msg;
/*------------------------------------------------------------------------------*/
/*______________________________________________________________________________*/


void setup() { 

  pinMode(13, OUTPUT); 
  digitalWrite(13, HIGH);
  
  // Declaration des alimentations capteurs 
  pinMode(10, OUTPUT); 
  pinMode(11, OUTPUT); 
  pinMode(12, OUTPUT); 

  Serial.begin(115200); 
  dht.begin(); 
  
  // Demarrage HX711
  capteur.begin(DAT, CLK); 
  capteur.set_scale(14100);
  tarage=35416;
  
  /* Tarage du capteur
  Serial.println("HX711");
  Serial.println("Tarage du capteur");
  Serial.println("Le capteur doit tre fix et ne pas tre touch ou dplac");
  tarage = capteur.read_average(50);
  Serial.print("Tarage : ");
  Serial.println(tarage);*/

  // Demarrage module Sigfox
  if (!SigFox.begin()) { 
    Serial.println("SigFox error, rebooting"); 
    reboot(); 
  } 
  delay(100);
  SigFox.debug(); 

  // Demarrage programme
  Serial.println("DEMARRAGE PROG");

  digitalWrite(13, LOW);
  
} 
 
void loop() {
  
  unsigned long currentMillis = millis();

  allumerCapteur();
  delay(1200);
  
  mesureDHT22();
  mesureDS18B20();
  mesureHX711();

  mesureValBatterie();
  mesureValPanneau();
  
  eteindreCapteur();

#if DEBUG

     affichageBatterie();
     affichagePanneau();
     affichagePoids();
     affichageDHT22();
     affichageDS18B20();

     //affichageTrame();
#endif
      sendData();
      LowPower.sleep(720000);
      resetData();
      
}


void resetData(){
  for(uint8_t i=0; i<11; i++){
    data[i]= 0x00;
  }
}

void sendData(){

      
  //digitalWrite(13, HIGH);
       
  /*_______________Envoie de la structure precedemment creer ______________________*/
  /*-------------------------------------------------------------------------------*/
  SigFox.status(); 
  SigFox.beginPacket(); 
  SigFox.write((uint8_t*)&data, sizeof(data)); 
  Serial.print("Status: "); 
  Serial.println(SigFox.endPacket()); 
  Serial.println("ENVOIE MESSAGE !!!\n\n");
  /*-------------------------------------------------------------------------------*/
  /*_______________________________________________________________________________*/

  //digitalWrite(13, LOW);

  
}
void reboot() { 
  //NVIC_SystemReset(); 
  while (1); 
} 

String printBinaryReverse(uint8_t * ptr, byte n){
  String trame = "";
  for (int i = 0 ; i <n; i++) {
    for (int b = 7; b >= 0; --b) {
      if (bitRead(*(ptr + i), b)) trame+="1";
      else  trame+="0";
    }
  }
  return trame;
}

void printBinary(uint8_t * ptr, byte n){
  for (int i = n-1 ; i>= 0; --i) {
    for (int b = 7; b >= 0; --b) {
      if (bitRead(*(ptr + i), b)) Serial.print("1");
      else Serial.print("0");
    }
    Serial.print(" ");
  }
}

int readBinaryString(char *s) {
  int result = 0;
  while(*s) {
    result <<= 1;
    if(*s++ == '1') result |= 1;
  }
  return result;
}

void startTemperatureMeasure(const byte addr[]) {
  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);
}


float readTemperatureMeasure(const byte addr[]) {
  byte data[9];
  ds.reset();
  ds.select(addr);
  ds.write(0xBE);
  for (byte i = 0; i < 9; i++) {
    data[i] = ds.read(); //  Scratchpad
  }
  // Temp en degrs
  return ((data[1] << 8) | data[0]) * 0.0625; 
}


void allumerCapteur(){
  digitalWrite(10, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(12, HIGH);
  capteur.power_up();
}

void eteindreCapteur(){
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  capteur.power_down();
}

void mesureDHT22(){
  h = dht.readHumidity();              // Lecture Humidite DHT22
  uint16_t hTemp = (uint16_t)(h*10);   // Affectation structure
  dataTemp = data[0]|(hTemp>>2);
  data[0] = lowByte(dataTemp);
  dataTemp = data[1]|(hTemp)<<6;
  data[1] = lowByte(dataTemp);
 
  t = dht.readTemperature();           // Lecture Temperature DHT22
  uint16_t tTemp = (uint16_t)((t+20)*10);     // Affectation structure
  dataTemp = data[1]|(tTemp>>5);
  data[1] = lowByte(dataTemp);
  dataTemp = data[2]|(tTemp)<<3;
  data[2] = lowByte(dataTemp);
}
 
void mesureDS18B20(){
  temperatureDS18B20[3];              // Tableau de Temperature
  startTemperatureMeasure(SENSOR_ADDRESS_1);  // Debut Mesure Capteur 1
  startTemperatureMeasure(SENSOR_ADDRESS_2);  // Debut Mesure Capteur 2
  startTemperatureMeasure(SENSOR_ADDRESS_3);  // Debut Mesure Capteur 3
  delay(800);                                 // Attente de mesure

  temperatureDS18B20[0] = (uint16_t)((readTemperatureMeasure(SENSOR_ADDRESS_1)+20)*10);
  temperatureDS18B20[1] = (uint16_t)((readTemperatureMeasure(SENSOR_ADDRESS_2)+20)*10);
  temperatureDS18B20[2] = (uint16_t)((readTemperatureMeasure(SENSOR_ADDRESS_3)+20)*10);

  dataTemp = data[2]|(temperatureDS18B20[0]>>8);
  data[2] = lowByte(dataTemp);
  dataTemp = data[3]|(temperatureDS18B20[0]);
  data[3] = lowByte(dataTemp);

  dataTemp = data[4]|(temperatureDS18B20[1]>>3);
  data[4] = lowByte(dataTemp);
  dataTemp = data[5]|(temperatureDS18B20[1]<<5);
  data[5] = lowByte(dataTemp);

  dataTemp = data[5]|(temperatureDS18B20[2]>>6);
  data[5] = lowByte(dataTemp);
  dataTemp = data[6]|(temperatureDS18B20[2]<<2);
  data[6] = lowByte(dataTemp);  
}

void mesureHX711(){
  valInt =  capteur.read_average(5) - tarage;              // Lecture Poids
  valeur =  0.00005021931f * (float)valInt;                // Conversion kg
  poids = (uint16_t)valeur*10; //(uint16_t)(-valeur)*10;   // Affectation structure
  dataTemp = data[7]|(poids>>3);
  data[7] = lowByte(dataTemp);
  dataTemp = data[8]|(poids<<5);
  data[8] = lowByte(dataTemp);
}

void mesureValBatterie(){
  uint16_t valBatterie = analogRead(A6);       // Lecture Tension Batterie
  uint8_t position = map(valBatterie, 870, 1023, 0, 100);
  if (position >= 100)  position = 100;
  else if(position <= 0)  position = 0;    
  batterie = position;
  dataTemp = data[9]|(batterie<<1);
  data[9] = lowByte(dataTemp);
}

void mesureValPanneau(){
  uint16_t valPanneau =  analogRead(A5)/10;         // Lecture Tension Pannneau
  panneau = valPanneau;              // Affectation structure
  dataTemp = data[10]|(panneau<<1);
  data[10] = lowByte(dataTemp);
}
  
void affichageBatterie(){
  /*_______________Affichage Tension Batterie (HEX,DEC)____________________________*/
  /*-------------------------------------------------------------------------------*/
  Serial.print("Batterie: "); 
  Serial.println(batterie); // display what we will send in Hexadecimal
  /*-------------------------------------------------------------------------------*/
  /*_______________________________________________________________________________*/
}

void affichagePanneau(){
  /*_______________Affichage Tension Panneau (HEX,DEC)_____________________________*/
  /*-------------------------------------------------------------------------------*/
  Serial.print("Panneau: "); 
  Serial.println(panneau); // display what we will send in Hexadecimal
  /*-------------------------------------------------------------------------------*/
  /*_______________________________________________________________________________*/
}

void affichageDHT22(){
  /*_______________Affichage Temperature DHT22 (HEX,DEC)___________________________*/
  /*-------------------------------------------------------------------------------*/
  Serial.print("Temperature DHT 22 : "); 
  Serial.println(t);
  /*-------------------------------------------------------------------------------*/
  /*_______________________________________________________________________________*/
 
  /*_______________Affichage Humidite DHT22 (HEX,DEC)______________________________*/
  /*-------------------------------------------------------------------------------*/
  Serial.print("Humidite DHT22 : "); 
  Serial.println(h); // display what we will send in Decimal 
  /*-------------------------------------------------------------------------------*/
  /*_______________________________________________________________________________*/
}

void affichageDS18B20(){
  /*_______________Affichage Temperature DS18BS20 EXT1 (HEX,DEC)___________________*/
  /*-------------------------------------------------------------------------------*/
  Serial.print("Temperature_EXT1 : ");
  Serial.println(((float)temperatureDS18B20[0]/10)-20);
  /*-------------------------------------------------------------------------------*/
  /*_______________________________________________________________________________*/

  /*_______________Affichage Temperature DS18BS20 EXT2 (HEX,DEC)___________________*/
  /*-------------------------------------------------------------------------------*/
  Serial.print("Temperature_EXT2 : ");
  Serial.println(((float)temperatureDS18B20[1]/10)-20);
  /*-------------------------------------------------------------------------------*/
  /*_______________________________________________________________________________*/

  /*_______________Affichage Temperature DS18BS20 EXT3 (HEX,DEC)___________________*/
  /*-------------------------------------------------------------------------------*/
  Serial.print("Temperature_EXT3 : ");
  Serial.println(((float)temperatureDS18B20[2]/10)-20);
  /*-------------------------------------------------------------------------------*/
  /*_______________________________________________________________________________*/
}

void affichagePoids(){
  /*_______________Affichage Poids en Kilogrammes (HEX,DEC)________________________*/
  /*-------------------------------------------------------------------------------*/
  Serial.print("Poids: ");
  Serial.println(poids); 
  /*-------------------------------------------------------------------------------*/
  /*_______________________________________________________________________________*/
}

void affichageTrame(){
  /*_______________Affichage de la Trame en format Binaire et de sa taille ________*/
  /*-------------------------------------------------------------------------------*/
  Serial.println("****** structure de base ******");
  Serial.print("Taille du message = ");
  Serial.println(sizeof(data));
  ptr = (uint8_t *) &data;
  printBinary(ptr, sizeof(data));
 
  /*-------------------------------------------------------------------------------*/
  /*_______________________________________________________________________________*/
}

Credits

YUSEF1810
1 project • 0 followers
batiana nacro
1 project • 0 followers
ghais
1 project • 0 followers
hicham talsi
1 project • 0 followers

Comments