• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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;
 
Сверху Снизу