• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Помогите пожалуйста сделать из двух скетчей один.

skeezn

New member
помогите пожалуйста объединить два скетча в один. такая ситуация, что уже день не могу собрать из двух скетчей один, понимаю что для профи это дело пяти минут, но у меня почему-то не получается всё сделать правильно, видимо потому что я нуб. нужно чтобы в приложении Blynk на телефоне отображались датчики ds18b20 4 штуки и датчик bme280, вот коды:
код на BME280

Код:
// BME 280
#include <Wire.h>
//#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

//  Подключается BME 280 по I2C:
//  Плата ESP-12E подключаем SCL - D1(GPIO5) // SDA - D2(GPIO4)
//  Плата Arduino UNO (NANO) SCL - А5 // SDA - А4

 // Если по SPI то вот для Ардуины
//#define BME_SCK 13
//#define BME_MISO 12
//#define BME_MOSI 11
//#define BME_CS 10

// Это стандартное давление для вашей местности в гектопаскаль
// Гуглим стандартное давление для своего города
// и переводим в гектопаскаль
// https://www.unitjuggler.com/перевод-pressure-из-mmHg-в-hPa.html?val=740
#define SEALEVELPRESSURE_HPA (1013.25) //1013.25 (760мм.рт.ст. = 1013.25 гПа (hPa))

Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI



//*************************************************************************
// Blynk

/* Comment this out to disable prints and save space */
#define BLYNK_PRINT Serial


#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "";
char pass[] = "";

BlynkTimer timer;
unsigned long delayTime = 1000; // Частота вывода в виджет


//*************************************************************************
// Код программы

// Функция для вывода данных в пять виджетов Lable Vaule
void sendSensor()
{
 
// Температура
  Blynk.virtualWrite(V0, bme.readTemperature(), " *С");
 
// Давление в милиметрах ртутного столба
  Blynk.virtualWrite(V1, (bme.readPressure() / 133.3F), " мм.рт.ст.");

// Влажность 
  Blynk.virtualWrite(V2, bme.readHumidity(), " %");

// Высота (Расчетная и не очень точная) это не высотомер 
  Blynk.virtualWrite(V3, bme.readAltitude(SEALEVELPRESSURE_HPA), " м");

}//sendSensor



void setup() {
    Serial.begin(9600);

// Запускаем датчик BME 280
    Serial.println(F("BME280 test"));   
    bool status;
    
// Здесь вводим адрес устройства
// По умолчанию адрес i2c равен 0x77.
// Если вы добавите перемычку из SDO в V3.3, адрес изменится на 0x77.
// Если вы добавите перемычку из SDO в GND, адрес изменится на 0x76.
    status = bme.begin(0x76); 
    if (!status) {
        Serial.println("Could not find a valid BME280 sensor, check wiring!");
        while (1);
    }
    bme.setSampling();
    Serial.println("-- Default Test --");
    Serial.println();

//*******************************************************
// Запускаем Blynk
  Blynk.begin(auth, ssid, pass);

// Настраиваем таймеры 
 
  timer.setInterval(delayTime, sendSensor);

// Настраиваем виджеты
  Blynk.setProperty(V0, "label", "Температура");
  Blynk.setProperty(V1, "label", "Давление");
  Blynk.setProperty(V2, "label", "Влажность");
  Blynk.setProperty(V3, "label", "Высота");
 
}//setup



void loop() {
    
    Blynk.run();
    timer.run();
}//loop
и код на датчики

Код:
/* ESP & Blynk */
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#define BLYNK_PRINT Serial   

/* Blynk credentials */
char auth[] = "";

/* WiFi credentials */
char ssid[] = "";
char pass[] = "";

/* TIMER */
#include <SimpleTimer.h>
SimpleTimer timer;

/* DS18B20 Temperature Sensor */
#include <OneWire.h>
#include<DallasTemperature.h>
#define ONE_WIRE_BUS 2 // DS18B20 подключаем на D4 на плате 
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
int temp_0;
int temp_1;
int temp_2;
int temp_3;

void setup()
{
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass);
  DS18B20.begin();
  timer.setInterval(1000L, getSendData);
  Serial.println(" ");
  Serial.println("Testing Dual Sensor data");
}

void loop()
{
  timer.run(); // Initiates SimpleTimer
  Blynk.run();
}

/***************************************************
 * Send Sensor data to Blynk
 **************************************************/
void getSendData()
{
  DS18B20.requestTemperatures();
  temp_0 = DS18B20.getTempCByIndex(0); // Sensor 0 показания для датчика 1 в цельсиях
  temp_1 = DS18B20.getTempCByIndex(1); // Sensor 0 показания для датчика 2 в цельсиях
  temp_2 = DS18B20.getTempCByIndex(2);// Sensor 0 показания для датчика 3 в цельсиях
  temp_3 = DS18B20.getTempCByIndex(3);// Sensor 0 показания для датчика 4 в цельсиях

  Serial.print("Temp_0: ");
  Serial.print(temp_0);
  Serial.print(" oC . Temp_1: ");
  Serial.print(temp_1);
  Serial.println(" oC");
  Serial.print("Temp_2: ");
  Serial.print(temp_0);
  Serial.print(" oC . Temp_3: ");
  Serial.print(temp_1);
  Serial.println(" oC");
 
  
  Blynk.virtualWrite(10, temp_0); //выврд данных на виртуальный пин V10
  Blynk.virtualWrite(11, temp_1); //вывод данных навиртуальный пин V11
  Blynk.virtualWrite(12, temp_2);
  Blynk.virtualWrite(13, temp_3);
}
Заранее спасибо <3
 

esp340

Active member
Что там объединять то? Заведи еще один таймер для второго датчика и запускай по нему вторую функцию или запихни все в одну функцию и один таймер, добавь виртуальных пинов в приложении и все.
 

nikolz

Well-known member
помогите пожалуйста объединить два скетча в один. такая ситуация, что уже день не могу собрать из двух скетчей один, понимаю что для профи это дело пяти минут, но у меня почему-то не получается всё сделать правильно, видимо потому что я нуб. нужно чтобы в приложении Blynk на телефоне отображались датчики ds18b20 4 штуки и датчик bme280, вот коды:
код на BME280

Код:
// BME 280
#include <Wire.h>
//#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

//  Подключается BME 280 по I2C:
//  Плата ESP-12E подключаем SCL - D1(GPIO5) // SDA - D2(GPIO4)
//  Плата Arduino UNO (NANO) SCL - А5 // SDA - А4

// Если по SPI то вот для Ардуины
//#define BME_SCK 13
//#define BME_MISO 12
//#define BME_MOSI 11
//#define BME_CS 10

// Это стандартное давление для вашей местности в гектопаскаль
// Гуглим стандартное давление для своего города
// и переводим в гектопаскаль
// https://www.unitjuggler.com/перевод-pressure-из-mmHg-в-hPa.html?val=740
#define SEALEVELPRESSURE_HPA (1013.25) //1013.25 (760мм.рт.ст. = 1013.25 гПа (hPa))

Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI



//*************************************************************************
// Blynk

/* Comment this out to disable prints and save space */
#define BLYNK_PRINT Serial


#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "";
char pass[] = "";

BlynkTimer timer;
unsigned long delayTime = 1000; // Частота вывода в виджет


//*************************************************************************
// Код программы

// Функция для вывода данных в пять виджетов Lable Vaule
void sendSensor()
{

// Температура
  Blynk.virtualWrite(V0, bme.readTemperature(), " *С");

// Давление в милиметрах ртутного столба
  Blynk.virtualWrite(V1, (bme.readPressure() / 133.3F), " мм.рт.ст.");

// Влажность
  Blynk.virtualWrite(V2, bme.readHumidity(), " %");

// Высота (Расчетная и не очень точная) это не высотомер
  Blynk.virtualWrite(V3, bme.readAltitude(SEALEVELPRESSURE_HPA), " м");

}//sendSensor



void setup() {
    Serial.begin(9600);

// Запускаем датчик BME 280
    Serial.println(F("BME280 test"));
    bool status;
 
// Здесь вводим адрес устройства
// По умолчанию адрес i2c равен 0x77.
// Если вы добавите перемычку из SDO в V3.3, адрес изменится на 0x77.
// Если вы добавите перемычку из SDO в GND, адрес изменится на 0x76.
    status = bme.begin(0x76);
    if (!status) {
        Serial.println("Could not find a valid BME280 sensor, check wiring!");
        while (1);
    }
    bme.setSampling();
    Serial.println("-- Default Test --");
    Serial.println();

//*******************************************************
// Запускаем Blynk
  Blynk.begin(auth, ssid, pass);

// Настраиваем таймеры

  timer.setInterval(delayTime, sendSensor);

// Настраиваем виджеты
  Blynk.setProperty(V0, "label", "Температура");
  Blynk.setProperty(V1, "label", "Давление");
  Blynk.setProperty(V2, "label", "Влажность");
  Blynk.setProperty(V3, "label", "Высота");

}//setup



void loop() {
 
    Blynk.run();
    timer.run();
}//loop
и код на датчики

Код:
/* ESP & Blynk */
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#define BLYNK_PRINT Serial

/* Blynk credentials */
char auth[] = "";

/* WiFi credentials */
char ssid[] = "";
char pass[] = "";

/* TIMER */
#include <SimpleTimer.h>
SimpleTimer timer;

/* DS18B20 Temperature Sensor */
#include <OneWire.h>
#include<DallasTemperature.h>
#define ONE_WIRE_BUS 2 // DS18B20 подключаем на D4 на плате
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
int temp_0;
int temp_1;
int temp_2;
int temp_3;

void setup()
{
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass);
  DS18B20.begin();
  timer.setInterval(1000L, getSendData);
  Serial.println(" ");
  Serial.println("Testing Dual Sensor data");
}

void loop()
{
  timer.run(); // Initiates SimpleTimer
  Blynk.run();
}

/***************************************************
* Send Sensor data to Blynk
**************************************************/
void getSendData()
{
  DS18B20.requestTemperatures();
  temp_0 = DS18B20.getTempCByIndex(0); // Sensor 0 показания для датчика 1 в цельсиях
  temp_1 = DS18B20.getTempCByIndex(1); // Sensor 0 показания для датчика 2 в цельсиях
  temp_2 = DS18B20.getTempCByIndex(2);// Sensor 0 показания для датчика 3 в цельсиях
  temp_3 = DS18B20.getTempCByIndex(3);// Sensor 0 показания для датчика 4 в цельсиях

  Serial.print("Temp_0: ");
  Serial.print(temp_0);
  Serial.print(" oC . Temp_1: ");
  Serial.print(temp_1);
  Serial.println(" oC");
  Serial.print("Temp_2: ");
  Serial.print(temp_0);
  Serial.print(" oC . Temp_3: ");
  Serial.print(temp_1);
  Serial.println(" oC");


  Blynk.virtualWrite(10, temp_0); //выврд данных на виртуальный пин V10
  Blynk.virtualWrite(11, temp_1); //вывод данных навиртуальный пин V11
  Blynk.virtualWrite(12, temp_2);
  Blynk.virtualWrite(13, temp_3);
}
Заранее спасибо <3
для начала соберите так:
В скриптах есть общие функции Setup и Loop. Объедините их содержимое
Далее перепишите все другие функции и все что вне этих функций в общий скрипт соблюдая последовательность как в исходных скриптах.
Потом проверьте явные ошибки. И снова спросите что непонятно.
 

skeezn

New member
Что там объединять то? Заведи еще один таймер для второго датчика и запускай по нему вторую функцию или запихни все в одну функцию и один таймер, добавь виртуальных пинов в приложении и все.
да я просто в написании программ полный 0, даже не знаю как работает таймер и куда его ставить
 

esp340

Active member
да я просто в написании программ полный 0, даже не знаю как работает таймер и куда его ставить
Ну, смотрите, у вас в скетче для ds18b20 прямо в комментариях написано
Код:
/* TIMER */
#include <SimpleTimer.h>
SimpleTimer timer;
т.е. с помощью библиотеки создается таймер(объект) с именем timer. Далее в setup указывается что этот таймер с интервалом в 1 секунду должен вызывать функцию getSendData которая в свою очередь считывает показания с датчиков и передает их в blynk. Заведите аналогичным образом еще один таймер, например
SimpleTimer timer_bme820;
и далее
timer_bme820.setInterval(1000L,sendSensor);
Ну и еще немного по аналогии нужно добавить/подправить код как вам уже сказал nikolz
 

skeezn

New member
Ну, смотрите, у вас в скетче для ds18b20 прямо в комментариях написано
Код:
/* TIMER */
#include <SimpleTimer.h>
SimpleTimer timer;
т.е. с помощью библиотеки создается таймер(объект) с именем timer. Далее в setup указывается что этот таймер с интервалом в 1 секунду должен вызывать функцию getSendData которая в свою очередь считывает показания с датчиков и передает их в blynk. Заведите аналогичным образом еще один таймер, например
SimpleTimer timer_bme820;
и далее
timer_bme820.setInterval(1000L,sendSensor);
Ну и еще немного по аналогии нужно добавить/подправить код как вам уже сказал nikolz
Спасибо вам большое, получился рабочий код <3<3
 

skeezn

New member
Оставлю для тех, кому он будет нужен, тут ds18b20 4 штуки и датчик bme280

Код:
// BME 280
#include <Wire.h>
//#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <OneWire.h>
#include<DallasTemperature.h>
#define ONE_WIRE_BUS 2 // DS18B20 подключаем на D4 на плате 
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
int temp_0;
int temp_1;
int temp_2;
int temp_3;

//  Подключается BME 280 по I2C:
//  Плата ESP-12E подключаем SCL - D1(GPIO5) // SDA - D2(GPIO4)
//  Плата Arduino UNO (NANO) SCL - А5 // SDA - А4

 // Если по SPI то вот для Ардуины
//#define BME_SCK 13
//#define BME_MISO 12
//#define BME_MOSI 11
//#define BME_CS 10

// Это стандартное давление для вашей местности в гектопаскаль
// Гуглим стандартное давление для своего города
// и переводим в гектопаскаль
// https://www.unitjuggler.com/перевод-pressure-из-mmHg-в-hPa.html?val=740
#define SEALEVELPRESSURE_HPA (1013.25) //1013.25 (760мм.рт.ст. = 1013.25 гПа (hPa))

Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI



//*************************************************************************
// Blynk

/* Comment this out to disable prints and save space */
#define BLYNK_PRINT Serial


#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = ""; // Код аутентификации для Blynk

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "Keenetic-3146"; // название вай-фай роутера
char pass[] = "aboba"; // Пароль от роутера

#include <SimpleTimer.h>
SimpleTimer timer;

unsigned long delayTime = 1000; // Частота вывода в виджет


//*************************************************************************
// Код программы

// Функция для вывода данных в пять виджетов Lable Vaule
void sendSensor()
{
 
// Температура
  Blynk.virtualWrite(V0, bme.readTemperature(), " *С");
 
// Давление в милиметрах ртутного столба
  Blynk.virtualWrite(V1, (bme.readPressure() / 133.3F), " мм.рт.ст.");

// Влажность 
  Blynk.virtualWrite(V2, bme.readHumidity(), " %");

// Высота (Расчетная и не очень точная) это не высотомер 
  Blynk.virtualWrite(V3, bme.readAltitude(SEALEVELPRESSURE_HPA), " м");

}//sendSensor



void setup() {
    Serial.begin(9600);

// Запускаем датчик BME 280
    Serial.println(F("BME280 test"));   
    bool status;
    
// Здесь вводим адрес устройства
// По умолчанию адрес i2c равен 0x77.
// Если вы добавите перемычку из SDO в V3.3, адрес изменится на 0x77.
// Если вы добавите перемычку из SDO в GND, адрес изменится на 0x76.
    status = bme.begin(0x76); 
    if (!status) {
        Serial.println("Could not find a valid BME280 sensor, check wiring!");
        while (1);
    }
    {
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass);
  DS18B20.begin();
  timer.setInterval(1000L, getSendData);
  Serial.println(" ");
  Serial.println("Testing Dual Sensor data");
}

    bme.setSampling();
    Serial.println("-- Default Test --");
    Serial.println();

//*******************************************************
// Запускаем Blynk
  Blynk.begin(auth, ssid, pass);

// Настраиваем таймеры 
  SimpleTimer timer_bme820;
  timer_bme820.setInterval(1000L,sendSensor);
  timer.setInterval(delayTime, sendSensor);

// Настраиваем виджеты
  Blynk.setProperty(V0, "label", "Температура");
  Blynk.setProperty(V1, "label", "Давление");
  Blynk.setProperty(V2, "label", "Влажность");
  Blynk.setProperty(V3, "label", "Высота");
 
}//setup



void loop(){

  timer.run(); // Initiates SimpleTimer
  Blynk.run();

}//loop

void getSendData()
{
  DS18B20.requestTemperatures();
  temp_0 = DS18B20.getTempCByIndex(0); // Sensor 0 показания для датчика 1 в цельсиях
  temp_1 = DS18B20.getTempCByIndex(1); // Sensor 0 показания для датчика 2 в цельсиях
  temp_2 = DS18B20.getTempCByIndex(2);// Sensor 0 показания для датчика 3 в цельсиях
  temp_3 = DS18B20.getTempCByIndex(3);// Sensor 0 показания для датчика 4 в цельсиях

  Serial.print("Temp_0: ");
  Serial.print(temp_0);
  Serial.print(" oC . Temp_1: ");
  Serial.print(temp_1);
  Serial.println(" oC");
  Serial.print("Temp_2: ");
  Serial.print(temp_0);
  Serial.print(" oC . Temp_3: ");
  Serial.print(temp_1);
  Serial.println(" oC");
 
  
  Blynk.virtualWrite(10, temp_0); //вывoд данных на виртуальный пин V10
  Blynk.virtualWrite(11, temp_1); //вывод данных на виртуальный пин V11
  Blynk.virtualWrite(12, temp_2); //вывод данных на виртуальный пин V12
  Blynk.virtualWrite(13, temp_3); //вывод данных на виртуальный пин V13
}
 

svs2007m

Active member
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
Это две одинаковые библиотеки. Причем первая тупо заточена на Blynk. Может лишний "балласт" не к чему :)
 

svs2007m

Active member
В свое время Blynk "перепахал" эту библиотеку BlynkSimpleEsp8266.h под свои виджеты и прочее...

SimpleTimer timer;
заменить на
BlynkTimer timer;
и вуаля

Раньше у них на оф.сайте было описание всех процедур и функций этой библиотеки. Там было по "гуще" чем у SimpleTimer. Правда кучеряво и именно для Blynk и его виджетов. (Вот такой Украинский софт :) )
 

skeezn

New member
В свое время Blynk "перепахал" эту библиотеку BlynkSimpleEsp8266.h под свои виджеты и прочее...

SimpleTimer timer;
заменить на
BlynkTimer timer;
и вуаля

Раньше у них на оф.сайте было описание всех процедур и функций этой библиотеки. Там было по "гуще" чем у SimpleTimer. Правда кучеряво и именно для Blynk и его виджетов. (Вот такой Украинский софт :) )
А вы не подскажете как в блинк выводить не просто 26 градусов, а 26.65
 

skeezn

New member
а то просто хотелось бы показания поточней, а как сделать не знаю
 

esp340

Active member
А вы не подскажете как в блинк выводить не просто 26 градусов, а 26.65
В вашем(или найденном вами) коде без разницы куда выводить - в блинк или не в блинк. Этот код выводит именно то что там задано. Почитайте что-нибудь за типы данных, например, здесь Думаю разберетесь, там не сложно.
 

svs2007m

Active member
Вот тут примеры по коду. А в настройках виджета есть информация по точности и значности выводимых данных. :)
 

esp340

Active member
какую, блин, команду!?
Вы про типы данных почитали?
Замените
Код:
int temp_0;
int temp_1;
int temp_2;
int temp_3;
на
Код:
float temp_0;
float temp_1;
float temp_2;
float temp_3;
 
Сверху Снизу