Обьединение скетчей

Inafta
Offline
Зарегистрирован: 20.07.2018

Здравствуйте. Я новичек, впрочем хотелось бы попросить помощи. У меня есть три скетча. Первый скетч это датчик который определяет температуру, давление, и влажность воздуха. Второй скетч это датчик освещенности в люксах. Третий скетч это датчик дождя и его интенсивности. Хотелось бы узнать как можно обьединить эти три скетча в один.

1)

#include <Wire.h>

#define BME280_ADDRESS 0x76
unsigned long int hum_raw,temp_raw,pres_raw;
signed long int t_fine;

uint16_t dig_T1;
 int16_t dig_T2;
 int16_t dig_T3;
uint16_t dig_P1;
 int16_t dig_P2;
 int16_t dig_P3;
 int16_t dig_P4;
 int16_t dig_P5;
 int16_t dig_P6;
 int16_t dig_P7;
 int16_t dig_P8;
 int16_t dig_P9;
 int8_t  dig_H1;
 int16_t dig_H2;
 int8_t  dig_H3;
 int16_t dig_H4;
 int16_t dig_H5;
 int8_t  dig_H6;

void setup()
{
    uint8_t osrs_t = 1;             //Temperature oversampling x 1
    uint8_t osrs_p = 1;             //Pressure oversampling x 1
    uint8_t osrs_h = 1;             //Humidity oversampling x 1
    uint8_t mode = 3;               //Normal mode
    uint8_t t_sb = 5;               //Tstandby 1000ms
    uint8_t filter = 0;             //Filter off 
    uint8_t spi3w_en = 0;           //3-wire SPI Disable

    uint8_t ctrl_meas_reg = (osrs_t << 5) | (osrs_p << 2) | mode;
    uint8_t config_reg    = (t_sb << 5) | (filter << 2) | spi3w_en;
    uint8_t ctrl_hum_reg  = osrs_h;

    Serial.begin(9600);
    Wire.begin();

    writeReg(0xF2,ctrl_hum_reg);
    writeReg(0xF4,ctrl_meas_reg);
    writeReg(0xF5,config_reg);
    readTrim();                    //
}


void loop()
{
    double temp_act = 0.0, press_act = 0.0,hum_act=0.0;
    signed long int temp_cal;
    unsigned long int press_cal,hum_cal;

    readData();

    temp_cal = calibration_T(temp_raw);
    press_cal = calibration_P(pres_raw);
    hum_cal = calibration_H(hum_raw);
    temp_act = (double)temp_cal / 100.0;
    press_act = (double)press_cal / 100.0;
    hum_act = (double)hum_cal / 1024.0;
    Serial.print("Temperature : ");
    Serial.print(temp_act);
    Serial.print(" C  Pressure : ");
    Serial.print(press_act);
    Serial.print(" hPa  Humidity : ");
    Serial.print(hum_act);
    Serial.println(" %");    

    delay(1000);
}
void readTrim()
{
    uint8_t data[32],i=0;                      // Fix 2014/04/06
    Wire.beginTransmission(BME280_ADDRESS);
    Wire.write(0x88);
    Wire.endTransmission();
    Wire.requestFrom(BME280_ADDRESS,24);       // Fix 2014/04/06
    while(Wire.available()){
        data[i] = Wire.read();
        i++;
    }

    Wire.beginTransmission(BME280_ADDRESS);    // Add 2014/04/06
    Wire.write(0xA1);                          // Add 2014/04/06
    Wire.endTransmission();                    // Add 2014/04/06
    Wire.requestFrom(BME280_ADDRESS,1);        // Add 2014/04/06
    data[i] = Wire.read();                     // Add 2014/04/06
    i++;                                       // Add 2014/04/06

    Wire.beginTransmission(BME280_ADDRESS);
    Wire.write(0xE1);
    Wire.endTransmission();
    Wire.requestFrom(BME280_ADDRESS,7);        // Fix 2014/04/06
    while(Wire.available()){
        data[i] = Wire.read();
        i++;    
    }
    dig_T1 = (data[1] << 8) | data[0];
    dig_T2 = (data[3] << 8) | data[2];
    dig_T3 = (data[5] << 8) | data[4];
    dig_P1 = (data[7] << 8) | data[6];
    dig_P2 = (data[9] << 8) | data[8];
    dig_P3 = (data[11]<< 8) | data[10];
    dig_P4 = (data[13]<< 8) | data[12];
    dig_P5 = (data[15]<< 8) | data[14];
    dig_P6 = (data[17]<< 8) | data[16];
    dig_P7 = (data[19]<< 8) | data[18];
    dig_P8 = (data[21]<< 8) | data[20];
    dig_P9 = (data[23]<< 8) | data[22];
    dig_H1 = data[24];
    dig_H2 = (data[26]<< 8) | data[25];
    dig_H3 = data[27];
    dig_H4 = (data[28]<< 4) | (0x0F & data[29]);
    dig_H5 = (data[30] << 4) | ((data[29] >> 4) & 0x0F); // Fix 2014/04/06
    dig_H6 = data[31];                                   // Fix 2014/04/06
}
void writeReg(uint8_t reg_address, uint8_t data)
{
    Wire.beginTransmission(BME280_ADDRESS);
    Wire.write(reg_address);
    Wire.write(data);
    Wire.endTransmission();    
}


void readData()
{
    int i = 0;
    uint32_t data[8];
    Wire.beginTransmission(BME280_ADDRESS);
    Wire.write(0xF7);
    Wire.endTransmission();
    Wire.requestFrom(BME280_ADDRESS,8);
    while(Wire.available()){
        data[i] = Wire.read();
        i++;
    }
    pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4);
    temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4);
    hum_raw  = (data[6] << 8) | data[7];
}


signed long int calibration_T(signed long int adc_T)
{

    signed long int var1, var2, T;
    var1 = ((((adc_T >> 3) - ((signed long int)dig_T1<<1))) * ((signed long int)dig_T2)) >> 11;
    var2 = (((((adc_T >> 4) - ((signed long int)dig_T1)) * ((adc_T>>4) - ((signed long int)dig_T1))) >> 12) * ((signed long int)dig_T3)) >> 14;

    t_fine = var1 + var2;
    T = (t_fine * 5 + 128) >> 8;
    return T; 
}

unsigned long int calibration_P(signed long int adc_P)
{
    signed long int var1, var2;
    unsigned long int P;
    var1 = (((signed long int)t_fine)>>1) - (signed long int)64000;
    var2 = (((var1>>2) * (var1>>2)) >> 11) * ((signed long int)dig_P6);
    var2 = var2 + ((var1*((signed long int)dig_P5))<<1);
    var2 = (var2>>2)+(((signed long int)dig_P4)<<16);
    var1 = (((dig_P3 * (((var1>>2)*(var1>>2)) >> 13)) >>3) + ((((signed long int)dig_P2) * var1)>>1))>>18;
    var1 = ((((32768+var1))*((signed long int)dig_P1))>>15);
    if (var1 == 0)
    {
        return 0;
    }    
    P = (((unsigned long int)(((signed long int)1048576)-adc_P)-(var2>>12)))*3125;
    if(P<0x80000000)
    {
       P = (P << 1) / ((unsigned long int) var1);   
    }
    else
    {
        P = (P / (unsigned long int)var1) * 2;    
    }
    var1 = (((signed long int)dig_P9) * ((signed long int)(((P>>3) * (P>>3))>>13)))>>12;
    var2 = (((signed long int)(P>>2)) * ((signed long int)dig_P8))>>13;
    P = (unsigned long int)((signed long int)P + ((var1 + var2 + dig_P7) >> 4));
    return P;
}

unsigned long int calibration_H(signed long int adc_H)
{
    signed long int v_x1;

    v_x1 = (t_fine - ((signed long int)76800));
    v_x1 = (((((adc_H << 14) -(((signed long int)dig_H4) << 20) - (((signed long int)dig_H5) * v_x1)) + 
              ((signed long int)16384)) >> 15) * (((((((v_x1 * ((signed long int)dig_H6)) >> 10) * 
              (((v_x1 * ((signed long int)dig_H3)) >> 11) + ((signed long int) 32768))) >> 10) + (( signed long int)2097152)) * 
              ((signed long int) dig_H2) + 8192) >> 14));
   v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * ((signed long int)dig_H1)) >> 4));
   v_x1 = (v_x1 < 0 ? 0 : v_x1);
   v_x1 = (v_x1 > 419430400 ? 419430400 : v_x1);
   return (unsigned long int)(v_x1 >> 12);   
}

2)

/*

  Example of BH1750 library usage.

  This example initialises the BH1750 object using the default high resolution
  continuous mode and then makes a light level reading every second.

  Connection:

    VCC -> 3V3 or 5V
    GND -> GND
    SCL -> SCL (A5 on Arduino Uno, Leonardo, etc or 21 on Mega and Due, on esp8266 free selectable)
    SDA -> SDA (A4 on Arduino Uno, Leonardo, etc or 20 on Mega and Due, on esp8266 free selectable)
    ADD -> (not connected) or GND

  ADD pin is used to set sensor I2C address. If it has voltage greater or equal to
  0.7VCC voltage (e.g. you've connected it to VCC) the sensor address will be
  0x5C. In other case (if ADD voltage less than 0.7 * VCC) the sensor address will
  be 0x23 (by default).

*/

#include <Wire.h>
#include <BH1750.h>

BH1750 lightMeter;


void setup(){

  Serial.begin(9600);

  // Initialize the I2C bus (BH1750 library doesn't do this automatically)
  Wire.begin();
  // On esp8266 you can select SCL and SDA pins using Wire.begin(D4, D3);

  lightMeter.begin();

  Serial.println(F("BH1750 Test begin"));

}


void loop() {

  uint16_t lux = lightMeter.readLightLevel();
  Serial.print("Light: ");
  Serial.print(lux);
  Serial.println(" lx");
  delay(1000);

}

И наконец 3)

/*
     
     Более подробно о проекте читайте тут:
     http://randomnerdtutorials.com/
     
    */
     
    int rainPin = A0;
    int greenLED = 6;
    int redLED = 7;
    // пороговое значение настраивается тут:
    int thresholdValue = 500;
     
    void setup(){
      pinMode(rainPin, INPUT);
      pinMode(greenLED, OUTPUT);
      pinMode(redLED, OUTPUT);
      digitalWrite(greenLED, LOW);
      digitalWrite(redLED, LOW);
      Serial.begin(9600);
    }
     
    void loop() {
      // считываем входящие данные с аналогового контакта 0:
      int sensorValue = analogRead(rainPin);
      Serial.print(sensorValue);
      if(sensorValue < thresholdValue){
        Serial.println(" - Rain");  //  " - Мокро"
        digitalWrite(greenLED, LOW);
        digitalWrite(redLED, HIGH);
      }
      else {
        Serial.println(" - Dry");  //  " - Сухо"
        digitalWrite(greenLED, HIGH);
        digitalWrite(redLED, LOW);
      }
      delay(500);
    }

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

А авторы скетчей чо говорят?

Inafta
Offline
Зарегистрирован: 20.07.2018

Все что сказали типо универсальный код для проверки датчика

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Шаг 1. по максимуму избавиться от Serial. Завести переменные под нужные показатели, всё покидать туда, в будущем возможно мониторить в сериал. Чтобы Serial.println() не было ровным слоем размазано по всему тексту.

Шаг 2. избавиться от совпадающих имён (на глаз не наблюдаю), одинаковых пинов, разнести на разные если что-то накладывается. Полностью исключить аппаратные и программные конфликты.

Шаг 3. Склеить setup(). В некоторых скетчах могут быть инструкции, которые повторяются в setup(). Убедиться что если что-то нужно сделать, типа Serial.begin() - оно делается, и однократно.

Шаг 4. Объявить (то есть полностью скопировать) используемые внешние нестандартные функции, типа void readData(). Убедиться что всё компилируется и нет жалоб. Будут жалобы - копать, что понакопировано неправильно и не туда.

Шаг 5 - склеивать loop(). Метода та же самая.

Inafta
Offline
Зарегистрирован: 20.07.2018

Спасибо, буду пробовать

Inafta
Offline
Зарегистрирован: 20.07.2018

блина ничего не выходит

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Значит, не судьба.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

1. Каждый скетч оформите подпрограммой, которая пишет данные в глобальные переменные. Неправильно, но можно.

2. Каждый скетч оформите подпрограммой, которая пишет данные по переданным указателям на данные. Малость лучше.

2. Каждый скетч превратить в класс. Идеально.

sadman41
Offline
Зарегистрирован: 19.10.2016

Пример дадите?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

mykaida пишет:
2. Каждый скетч превратить в класс. Идеально.

/**/
unsigned long mill; // переменная под millis()
//--------------------------------
class Cl_Unit1 {
  protected:
  public:
    Cl_Unit1() {}
    void init() {}
    void run() {}
};
//--------------------------------
class Cl_Unit2 {
  protected:
  public:
    Cl_Unit2() {}
    void init() {}
    void run() {}
};
//--------------------------------
class Cl_Unit3 {
  protected:
  public:
    Cl_Unit3() {}
    void init() {}
    void run() {}
};
//---Компоновка-----------------------------
Cl_Unit1 Unit1;
Cl_Unit2 Unit2;
Cl_Unit3 Unit3;
//---main-----------------------------
void setup() {
  Unit1.init();
  Unit2.init();
  Unit3.init();
}

void loop() {
  mill = millis();
  Unit1.run();
  Unit2.run();
  Unit3.run();
}
/**/

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

qwone пишет:

mykaida пишет:
2. Каждый скетч превратить в класс. Идеально.

/**/
unsigned long mill; // переменная под millis()
//--------------------------------
class Cl_Unit1 {
  protected:
  public:
    Cl_Unit1() {}
    void init() {}
    void run() {}
};
//--------------------------------
class Cl_Unit2 {
  protected:
  public:
    Cl_Unit2() {}
    void init() {}
    void run() {}
};
//--------------------------------
class Cl_Unit3 {
  protected:
  public:
    Cl_Unit3() {}
    void init() {}
    void run() {}
};
//---Компоновка-----------------------------
Cl_Unit1 Unit1;
Cl_Unit2 Unit2;
Cl_Unit3 Unit3;
//---main-----------------------------
void setup() {
  Unit1.init();
  Unit2.init();
  Unit3.init();
}

void loop() {
  mill = millis();
  Unit1.run();
  Unit2.run();
  Unit3.run();
}
/**/

 

Спасибо! Под рукой ничего не было. А по хорошему изумительные статьи на форуме:

http://arduino.ru/forum/programmirovanie/klass-titanovyi-velosiped-stopw...

Изучите и пишите!