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

Обсуждение Blynk и ESP8266

kand74

New member
Добрый день!!! Необходима помощь.
Имеется устройство, которое требует для включения, подать высокий уровень, длительностью более 300 ms. В приложении добавлена кнопка в режиме PUSH, на пин GP12. В ESP 8266 залит простенький скетч:

Код:
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

#define Sigaon 12

char auth[] = "xxxx";
char ssid[] = "xxxxx";
char pass[] = "xxxxx";

void setup() {

  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass, IPAddress(xxx.xxx.xxx.xxx), 8080);  
  pinMode(Sigaon, OUTPUT);
  digitalWrite(Sigaon, LOW);
}

void loop()
{
  Blynk.run();
 
}
Соответственно кратковременное нажатие на кнопку не дает результата(((
Подскажите пожалуйста как реализовать необходимою мне длительность импульса при однократном нажатии. Читал на форуме несколько тем по поводу кнопки, но не добился результата((
 

Jon

Member
Вот, что-то не получается у меня его запуститm, ни на UNO , ни на ESP
надо внимательно выполнить все процедуры запуска. Сосредоточьтесь только на одном конкретном устройстве.
Получите уникальный идентификатор auth . Запустите стандартный пример. вставте auth в свой скеч, укажите в примере свою сеть и все заработает.
 

Jon

Member
Вот, что-то не получается у меня его запуститm, ни на UNO , ни на ESP
надо внимательно выполнить все процедуры запуска. Сосредоточьтесь только на одном конкретном устройстве.
Получите уникальный идентификатор auth . Запустите стандартный пример. вставте auth в свой скеч, укажите в примере свою сеть и все заработает.
 

Sib-Energy

New member
Помогите разобраться почему поменялись местами показания двух датчиков, подключенных на порты 2 и 4

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS_1 2
#define ONE_WIRE_BUS_2 4
OneWire oneWire_air(ONE_WIRE_BUS_1);
OneWire oneWire_heat(ONE_WIRE_BUS_2);
DallasTemperature sensor_air(&oneWire_air);
DallasTemperature sensor_heat(&oneWire_heat);

char auth[] = "***";

char ssid[] = "***";
char pass[] = "***";

BlynkTimer timer;

void myTimerEvent()
{
// You can send any value at any time.
// Please don't send more that 10 values per second.
int T;
sensor_air.requestTemperatures(); T=sensor_air.getTempCByIndex(0);
Serial.print("Air: "); Serial.println(T); Blynk.virtualWrite(V1,T);
sensor_heat.requestTemperatures(); T=sensor_heat.getTempCByIndex(0);
Serial.print("Heat: "); Serial.println(T); Blynk.virtualWrite(V2,T);
}

void setup()
{
// Debug console
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
sensor_air.begin();
sensor_heat.begin();
timer.setInterval(2000L, myTimerEvent);
}

void loop()
{
Blynk.run();
timer.run();
}
 
Добрый день! Собираю по маленьку типа умный дом, для обкатки на макетке установлены Wemos D1 mini, вольтметр zmpt101b, 2 светодиода, bme280 и диммер с определением нуля от Robotdyn ну БП. С помощью знакомого написан скетч, к блинку подключается, отправляет данные температуры, влажности, давления, напряжение в сети, вкл-выкл светодиодов с плавным розжигом и затуханием. И это даже работает. Теперь проблемы: Библиотека вольтметра (EmonLib.h) и диммера (RBDdimmer.h) судя по всему используют прерывания как и библа Blynk, все вместе вызывает конфликты, срабатывает wdt reset. Если оставить только вольтметр работает, но подключается плата к серверу после перезагрузки минут 15 и данные отправляются не строго через 2 сек, а рандомно, видимо кто одеяло на себя перетянет.
И главный вопрос к знатокам - как победить вражду библиотек в плане прерываний. Спасибо.
Код:
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include "BlynkSimpleEsp8266.h"
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include "EmonLib.h"             // Include Emon Library
#define SEALEVELPRESSURE_HPA (1013.25)
EnergyMonitor emon1;             // Create an instance

//Setup connection of the sensor
Adafruit_BME280 bme; // I2C

const char* ssid = "TP-LINK_BCD82df";
const char* password = "12321";
const char* blynkToken = "Fdp12HFhZmexlTN72tOTsbyVqXwdzk3Ov";

bool isWiFiConnected = false;
int numTimerReconnect = 0;

WiFiEventHandler gotIpEventHandler;
WiFiEventHandler disconnectedEventHandler;
BlynkTimer timer;

float pressure;     //To store the barometric pressure (Pa)
float temperature;  //To store the temperature (oC)
int altimeter;      //To store the humidity (%) (you can also use it as a float variable)
int oldBrightV0 = 0, newBrightV0 = 0, oldBrightV5 = 0, newBrightV5 = 0;

void WiFiStationConnected(const WiFiEventStationModeGotIP& event);
void WiFiStationDisconnected(const WiFiEventStationModeDisconnected& event);
void ReconnectBlynk(void);
void BlynkRun(void);

BLYNK_WRITE(V0)
{
  int pinValue = param.asInt();
  pinValue = map(pinValue, 0, 100, 0, 1023);
  newBrightV0 = pinValue;
}
BLYNK_WRITE(V5)
{
  int pinValue = param.asInt();
  pinValue = map(pinValue, 0, 100, 0, 1023);
  newBrightV5 = pinValue;
}
BLYNK_CONNECTED()
{
  Blynk.syncAll();
}

void setup()
{
  bme.begin(0x76);    //Begin the sensor
  Serial.begin(115200);
  emon1.voltage(A0, 873, 1.7);  // Voltage: input pin, calibration, phase_shift

  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(D7, OUTPUT);
  pinMode(D8, OUTPUT);
  gotIpEventHandler = WiFi.onStationModeGotIP(&WiFiStationConnected);
  disconnectedEventHandler = WiFi.onStationModeDisconnected(&WiFiStationDisconnected);

  WiFi.begin(ssid, password);

  Blynk.config(blynkToken, "blynk-cloud.com", 8080);

  if (Blynk.connect())
  {
    Serial.printf("[%8lu] setup: Blynk connected\r\n", millis());
  }
  else
  {
    Serial.printf("[%8lu] setup: Blynk no connected\r\n", millis());
  }

  Serial.printf("[%8lu] Setup: Start timer reconnected\r\n", millis());
  numTimerReconnect = timer.setInterval(30000, ReconnectBlynk);
  timer.setInterval(2000L, ReadSensors);   // read sensor every 2s
  timer.setInterval(60L, setBrightSlowD7);   // set bright LED on D7 every 0.06s
  timer.setInterval(60L, setBrightSlowD8);   // set bright LED on D8 every 0.06s
}

void setBrightSlowD7()
{
  if (newBrightV0 != oldBrightV0) {
    if (abs(newBrightV0 - oldBrightV0) >= 35) {
      if (newBrightV0 >= oldBrightV0) {
        oldBrightV0 = oldBrightV0 + 35;
      }
      else {
        oldBrightV0 = oldBrightV0 - 35;
      }
    }
    else {
      oldBrightV0 = newBrightV0;
    }
    analogWrite(D7, oldBrightV0);
  }
}

void setBrightSlowD8()
{
  if (newBrightV5 != oldBrightV5) {
    if (abs(newBrightV5 - oldBrightV5) >= 35) {
      if (newBrightV5 >= oldBrightV5) {
        oldBrightV5 = oldBrightV5 + 35;
      }
      else {
        oldBrightV5 = oldBrightV5 - 35;
      }
    }
    else {
      oldBrightV5 = newBrightV5;
    }
    analogWrite(D8, oldBrightV5);
  }
}

void ReadSensors() {
  //Read values from the sensor:
  digitalWrite(LED_BUILTIN, LOW);
  pressure = bme.readPressure();
  temperature = bme.readTemperature();
  altimeter = bme.readHumidity ();
  Blynk.virtualWrite(V10, millis()/1000/60);
 
  emon1.calcVI(20, 2000);        // Calculate all. No.of half wavelengths (crossings), time-out
  float Vrms = (emon1.Vrms - 3);

  Blynk.virtualWrite(V1, pressure / 133.33);   // write pressure to V1 value display widget
  Blynk.virtualWrite(V3, temperature);  // write temperature to V3 value display widget
  Blynk.virtualWrite(V2, altimeter);    // write altimeter to V2 value display widget
  Blynk.virtualWrite(V4, Vrms);    // write voltage to V4 value display widget

  //Print values to serial monitor:
  Serial.print(F("Pressure: "));
  Serial.print(pressure / 133.33);
  Serial.print(" mmHg");
  Serial.print("\t");
  Serial.print(("Temp: "));
  Serial.print(temperature);
  Serial.print(" °C");
  Serial.print("\t");
  Serial.print("Humidity: ");
  Serial.print(altimeter); // this should be adjusted to your local forcase
  Serial.println(" %");
  digitalWrite(LED_BUILTIN, HIGH);
}

void loop()
{
  BlynkRun();
  timer.run();
}

void WiFiStationConnected(const WiFiEventStationModeGotIP& event)
{
  isWiFiConnected = true;
  Serial.printf("[%8lu] Interrupt: Connected to AP, Ip: ", millis());
  Serial.println(WiFi.localIP());
}

void WiFiStationDisconnected(const WiFiEventStationModeDisconnected& event)
{
  isWiFiConnected = false;
  Serial.printf("[%8lu] Interrupt: Disconnected to AP!\r\n", millis());
}

void BlynkRun(void)
{
  if (isWiFiConnected)
  {
    if (Blynk.connected())
    {
      if (timer.isEnabled(numTimerReconnect))
      {
        timer.disable(numTimerReconnect);
        Serial.printf("[%8lu] BlynkRun: Stop timer reconnected\r\n", millis());
      }

      Blynk.run();
    }
    else
    {
      if (!timer.isEnabled(numTimerReconnect))
      {
        timer.enable(numTimerReconnect);
        Serial.printf("[%8lu] BlynkRun: Start timer reconnected\r\n", millis());
      }
    }
  }
}

void ReconnectBlynk(void)
{
  if (!Blynk.connected())
  {
    if (Blynk.connect())
    {
      Serial.printf("[%8lu] ReconnectBlynk: Blynk reconnected\r\n", millis());
    }
    else
    {
      Serial.printf("[%8lu] ReconnectBlynk: Blynk not reconnected\r\n", millis());
    }
  }
  else
  {
    Serial.printf("[%8lu] ReconnectBlynk: Blynk connected\r\n", millis());
  }
}
 

Сергей_Ф

Moderator
Команда форума
Так и не понял как редактировать сообщение...
Редактирование доступно в течении 5 минут после написания.
По поводу вашего вопроса, можно посоветовать поискать другие библиотеки или переписать их так, что бы они не конфликтовали.
 

Сергей_Ф

Moderator
Команда форума
Перепробовал все, что нашел на ESP для диммера, реакция та же. А переписать мне знаний не хватит, могу много чего, но программирование не мое
Тогда разбивайте на несколько устройств, которые будут отвечать каждый за свою часть. Или обратитесь в тему https://esp8266.ru/forum/forums/custom-projects/
 

ildaronii

New member
Приветствую!
Такой вопрос. Имеется два девайса ESP8266 для разных целей и задач, находятся в разных сетях, но вообще сети объедены через VPN. Так вот на обоих я использовал один и тот же ID (идентификатор). Пока всё вроде работает. Чем то это чревато?
 

Jon

Member
Приветствую!
Такой вопрос. Имеется два девайса ESP8266 для разных целей и задач, находятся в разных сетях, но вообще сети объедены через VPN. Так вот на обоих я использовал один и тот же ID (идентификатор). Пока всё вроде работает. Чем то это чревато?
У меня несколько лет в таком режиме работает управление шторами. Каждое окно на отдельном дивайсе, а интерфейс один.
Все работает стабильно. Сложно только определить какой конкретно дивайс отвалился от сети.
 

Moseich

Member
Пришлось перейти на новый БЛИНК и тут возникла проблема с отпракой сообщения на email.
Я выполнил все по описанию, скетч компилируется. Понимаю что засада моя в таймерах которые не понимаю. Кстати сегодня мне исполнилось 77 лет и память подводит). Прошу помочь разобраться - укажите ошибку
 

Moseich

Member
Код:
/*************************************************************
 
  /* ----------------ПИНЫ------------
*                 D1- датчики температуры DS18B20
*                 D2- "сухой контакт"
*                 А0- АС_220 датчик   уведомления
*    V0-  RELE_3
*    V1-   TEMP_1
*    V2-   TEMP_2 
*    V3-   seconds  время работы
*    V4- RELE_4
*    V5- RELE_1
*    V6- RELE_2  
*    V7 -_~220
*    V8 - сухой контакт
*************************************************************/

#define BLYNK_TEMPLATE_ID " "
#define BLYNK_DEVICE_NAME "Prototip 2"
#define BLYNK_AUTH_TOKEN "Ix50 Jfp "

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "NERI";
char pass[] = "VA w u";

#define RELE_1 D5
#define RELE_2 D6
#define RELE_3 D0
#define RELE_4 D7



//#define AC A0 //контроль наличия ~220v
//int val = 0;
////температурные пороги для регулятора T:
//int m =25;
//int n =22;
//const int btnPin = D2;//вход контроля контакта
//WidgetLED LED(V8);




// Подключение  DS18B20
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS D1
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

BlynkTimer timer;//мониторинг времени
void myTimerEvent() //каждую секунду отправляет время безотказной
//работы Arduino на виртуальный вывод V3
{
Blynk.virtualWrite(V3, millis() / 1000   );
}



BLYNK_CONNECTED()
{
  Blynk.syncVirtual(V5,V6,V0,V4);
}           
BLYNK_WRITE(V5)   
{
  int value = param.asInt();
  if(param.asInt() == 1)
{
  digitalWrite(RELE_1,LOW);
}
else
{
  digitalWrite(RELE_1,HIGH);
}
}
BLYNK_WRITE(V6)
{
int value = param.asInt();
  if(param.asInt() == 1)
{
digitalWrite(RELE_2,LOW);
}
else
{
digitalWrite(RELE_2,HIGH);
}
}
BLYNK_WRITE(V0)
{
int value = param.asInt();
  if(param.asInt() == 1)
{
digitalWrite(RELE_3,LOW);
}
else
{
digitalWrite(RELE_3,HIGH);
}}
BLYNK_WRITE(V4)
{
int value = param.asInt();
  if(param.asInt() == 1)
{
digitalWrite(RELE_4,LOW);
}
else
{
digitalWrite(RELE_4,HIGH);
}
}

void sendTemps()
{
sensors.requestTemperatures();
float temp  = sensors.getTempCByIndex(0);
  float temp1 = sensors.getTempCByIndex(1);
Blynk.virtualWrite(V1, temp );
  delay(100);
Blynk.virtualWrite(V2, temp1);
  delay(100);
Serial.println (temp );
}






void setup()
{
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
sensors.begin();  //DS
pinMode (RELE_1,OUTPUT);
digitalWrite (RELE_1, HIGH);
pinMode (RELE_2,OUTPUT);
digitalWrite (RELE_2, HIGH);
pinMode (RELE_3,OUTPUT);
digitalWrite (RELE_3, HIGH);
pinMode (RELE_4 ,OUTPUT);
digitalWrite(RELE_4,HIGH);


/****************MAIL*****************************/
timer.setInterval(2000L, mail);
}
void mail(){
static bool mailSent = false;
float sent=sensors.getTempCByIndex(0);
if (sent >= 25 && !mailSent) {
Blynk.email("vgokh@mail.ru", "ВНИМАНИЕ перегрев!");
//отправка майла при приходе сигнала
mailSent = true;
}
else if (sent < 25) mailSent = false;
}
/****************MAIL*****************************/


void loop()
{

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

}
 

Jon

Member
1.В бесконечном цикле (loop) уберите запуск mail(). Эта программа у вас запускается по таймеру.
2. sendTemps() тоже надо запускать через таймер, а не в главном цикле.
3. Задержки типа delay(100) тоже надо убрать. Blink не любит терять контроль над процессором.
4. Ну и надо подумать как не посылать бесконечное количество писем если условия передачи выполняется.
 

svs2007m

Active member
Если Blynk не локольном сервере ... Наши украинские ... короче косяки НО можно и попробовать как тут :)
 

Moseich

Member
На свежую голову разобрался! Оказывается сообщения не требуют кодирования вовсе. Достаточно прописать задачу в облачной консоли
Спасибо всем, кто хотел мне помочь!(y)
 

Вложения

Сверху Снизу