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

Обсуждение Blynk - примеры, документация и FAQ

StalSan

New member
@Jon, спасибо за подсказку, скетч переработал, теперь работает отлично
Код:
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>


char auth[] = "xxxx";
const int OSPin = 12; //open State Pin
const int CSPin = 14; //close State Pin
const int LedOSPin = V12; //open State VPin for Led
const int LedCSPin = V14; //close State VPin for Led
const int LCDPin1 = V1; //VPin for LCD строка 1
const int LCDPin2 = V2; //VPin for LCD строка 2
boolean LastStateCSPin; //Флаг последнего состояния пина close State Pin
boolean LastStateOSPin; //Флаг последнего состояния пина open State Pin
boolean StateCSPin; //Флаг текущего состояния пина close State Pin
boolean StateOSPin; //Флаг текущего состояния пина open State Pin
int state; //флаг состояния ворот для цикла проверки

void setup()
{
  Serial.begin(9600);
  Blynk.begin(auth, "XXXXX", "XXXXX");

  while (Blynk.connect() == false) {
  // Wait until connected
  }
  pinMode(OSPin, INPUT);
  pinMode(CSPin, INPUT);
  Blynk.virtualWrite(LedOSPin, 0);
  Blynk.virtualWrite(LedCSPin, 0);
}

void checkState()
{
  if(StateOSPin==HIGH&&state!=0)
  {
    state = 0;
    Blynk.virtualWrite(LCDPin1, " open"); //вывод состояни на виджет LCD, строка 1
    Blynk.virtualWrite(LCDPin2, " "); //вывод состояни на виджет LCD, строка 2
    Blynk.virtualWrite(LedOSPin, 1023); //включаем виджет LED состояния "открыто"
    Blynk.virtualWrite(LedCSPin, 0); //тушим виджет LED состояния "закрыто"
    Blynk.notify("open"); //шлем на смартфон оповещение "ворота открыты"
  }
    if(StateCSPin==HIGH&&state!=1)
  {
    state = 1;
    Blynk.virtualWrite(LCDPin1, "close"); //вывод состояни на виджет LCD, строка 1
    Blynk.virtualWrite(LCDPin2, " "); //вывод состояни на виджет LCD, строка 2
    Blynk.virtualWrite(LedOSPin, 0); //тушим виджет LED состояния "открыто"
    Blynk.virtualWrite(LedCSPin, 1023); //включаем виджет LED состояния "закрыто"
    Blynk.notify("close");  // шлем на смартфон оповещение "ворота закрыты"
  }
    if(StateOSPin==LOW&&StateCSPin==LOW&&LastStateCSPin==HIGH&&state!=3)
  {
    state = 3;
    Blynk.virtualWrite(LCDPin1, "opening"); //вывод состояни на виджет LCD, строка 1
    Blynk.virtualWrite(LCDPin2, "<--<--<--"); //вывод состояни на виджет LCD, строка 2
    Blynk.virtualWrite(LedOSPin, 0); //тушим виджет LED состояния "открыто"
    Blynk.virtualWrite(LedCSPin, 0); //тушим виджет LED состояния "закрыто"
    Blynk.notify("opening"); //шлем на смартфон оповещение "ворота открываются"
  }
    if(StateOSPin==LOW&&StateCSPin==LOW&&LastStateOSPin==HIGH&&state!=4)
  {
    state = 4;
    Blynk.virtualWrite(LCDPin1, "closing"); //вывод состояни на виджет LCD, строка 1
    Blynk.virtualWrite(LCDPin2, "-->-->-->"); //вывод состояни на виджет LCD, строка 2
    Blynk.virtualWrite(LedOSPin, 0); //тушим виджет LED состояния "открыто"
    Blynk.virtualWrite(LedCSPin, 0); //тушим виджет LED состояния "закрыто"
    Blynk.notify("closing..."); //шлем на смартфон оповещение "ворота закрываются"
  }
  LastStateCSPin = StateCSPin; //запоминаем последнее состояние пина close State Pin
  LastStateOSPin = StateOSPin; //запоминаем последнее состояние пина open State Pin
}
 
void loop()
{
  Blynk.run();
  StateCSPin = digitalRead(CSPin); //запоминаем текущее состояние пина close State Pin
  StateOSPin = digitalRead(OSPin); //запоминаем текущее состояние пина open State Pin
  checkState();
}
 

Rom13j

New member
Подскажите, пожалуйста, в чем может быть проблема: режим, который изначально задан как "0", сам переключается в "1". Я сейчас только учусь и если ошибся темой направьте, пожалуйста в нужную. Это выдает монитор порта: Gyazo - 4c164db203c475973319111cc6d6b673.png. А вот код в Arduino IDE:
Код:
#include "DHT.h"
#define DHTPIN 2 // what digital pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#define RELAY_1 5                            //Выход на реле или светодиод
#define BUTTON_1 12                           //Кнопка
boolean Status1 = true;                       //объявляем статус реле в 0
boolean btnPress1 = false;                    //объявляем что кнопка не нажата 0
boolean lastbtnStat1 = false;                 //временная переменная для хранения статуса
int regim1 = 0;                               //режим по умолчанию при включении
                        
long last_mls4 = millis();


// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
const char* ssid     = "ssid";
const char* password = "pass";
char auth[] = "token";
DHT dht(DHTPIN, DHTTYPE);
WidgetLED led1(V4);

void setup()
{
  Serial.begin(115200);
  Blynk.begin(auth, ssid, password);
  dht.begin();

  pinMode(RELAY_1, OUTPUT);                  //Выход на реле или светодиод
  pinMode(BUTTON_1, INPUT);                  //Кнопка
  digitalWrite(RELAY_1, Status1);            //устанавливаем на выходе статус реле
}

void Send(){
   float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
    {
  Blynk.virtualWrite(V2, h);
  Blynk.virtualWrite(V3, t);
  }
}


void button1() {
  btnPress1 = digitalRead(BUTTON_1);
  Status1 = digitalRead(RELAY_1);
  if (btnPress1 == LOW && lastbtnStat1 == false) {
    delay(30); // защита от дребезга
    regim1++;
    lastbtnStat1 = true;
    if (regim1 > 1) {
      regim1 = 0;
    }
  }
  if (btnPress1 == HIGH && lastbtnStat1 == true) {
    lastbtnStat1 = false;
  }

  if (regim1 == 0) {
    Status1 = true;
    digitalWrite(RELAY_1, Status1);
    led1.off();
  
  }
  if (regim1 == 1) {
    Status1 = false;
    digitalWrite(RELAY_1, Status1);
    led1.on();
  
    }

  Serial.print("Regim:");
  Serial.println(regim1);
  Serial.print("Relay:");
  Serial.println(Status1);
}

void loop()
{
  Blynk.run();
  Send();
  button1();
  }
 

Jon

Member
в чем может быть проблема: режим, который изначально задан как "0", сам переключается в "1".
1) что за модуль используется? #define BUTTON_1 12 //Кнопка
Что-то я не помню у какого модуля ESP имеется больше десяти портов. У вас кнопка на 12 порту, это скорей всего какой-то служебный порт и там может быть любое состояние помимо вашей кнопки.
2) опрос датчиков нужно вести не чаще 1 раза в секунду и делать это через таймер.
3) Судя по монитору Blink с трудом пролез со своей синхронизацией в ваш бесконечный цикл опроса датчика.
Для отладки отключить Blink и выявить неисправность обычным способом.
 

Rom13j

New member
Спасибо за ответ. Проверил без Blynk, все работает отлично, заметил, что именно после подключения к серверу Blynk изменяется режим. Поставил как вы и порекомендовали через таймер, проблема все равно остается. Не подскажете куда дальше можно посмотреть. Выкладываю скетч:
Код:
#include "DHT.h"
#define DHTPIN 2 // what digital pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h> //таймер
#define RELAY_1 5                            //Выход на реле или светодиод
#define BUTTON_1 4                           //Кнопка
#define BUTTON_2 14                           //Кнопка
boolean Status1 = true;                       //объявляем статус реле в 0
boolean btnPress1 = false;                    //объявляем что кнопка не нажата 0
boolean lastbtnStat1 = false;                 //временная переменная для хранения статуса
boolean btnPress2 = false;                    //объявляем что кнопка не нажата 0
boolean lastbtnStat2 = false;                 //временная переменная для хранения статуса
int regim1 = 0;                               //режим по умолчанию при включении
int regim2 = 0;
int hm = 0;
int h;

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
const char* ssid     = "ssid";
const char* password = "pass";
char auth[] = "auth";
DHT dht(DHTPIN, DHTTYPE);
SimpleTimer timer;

WidgetLED led1(V4);
WidgetLED led2(V5);

void Send(){
   float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  {
  Blynk.virtualWrite(V2, h);
  Blynk.virtualWrite(V3, t);
  }
 
}


void hum()                             //функция чтения с датчика dht
{
int h = dht.readHumidity();
Serial.print("humidity:");
  Serial.println(h);
  if (h < 47)                 //если влажность меньше указанного
  {
    hm = 1;                     //то hm 1
  } else if (h > 55)                                     //если нет то 0
  {
    hm = 0;
  }
  Serial.print("Hum_ch:");
  Serial.println(hm);
}

void reg() {

int h = dht.readHumidity();
  if (regim2 == 1 && hm == 1) {
      Status1 = false;
      digitalWrite(RELAY_1, Status1);
    }
  if (regim2 == 1 && hm == 0) {
    Status1 = true;
    digitalWrite(RELAY_1, Status1);
  }

  if (regim1 == 1 && h > 60) {
      regim1 = 0;
          }
}

void button1() {
  btnPress1 = digitalRead(BUTTON_1);
  Status1 = digitalRead(RELAY_1);
  if (btnPress1 == LOW && lastbtnStat1 == false) {
    delay(30); // защита от дребезга
    regim1++;
    lastbtnStat1 = true;
    if (regim1 > 1) {
      regim1 = 0;
    }
  }
  if (btnPress1 == HIGH && lastbtnStat1 == true) {
    lastbtnStat1 = false;
  }

  if (regim1 == 0 && regim2 == 0) {
    Status1 = true;
    digitalWrite(RELAY_1, Status1);
    led1.off();
    led2.off();
 
  }
  if (regim1 == 1) {
    regim2 = 0;
    Status1 = false;
    digitalWrite(RELAY_1, Status1);
    led1.on();
    led2.off();
      }

  Serial.print("Regim:");
  Serial.println(regim1);
  Serial.print("Relay:");
  Serial.println(Status1);
}

void button2() {
  btnPress2 = digitalRead(BUTTON_2);
  Status1 = digitalRead(RELAY_1);
  if (btnPress2 == LOW && lastbtnStat2 == false) {
    delay(30); // защита от дребезга
    regim2++;
    lastbtnStat2 = true;
    if (regim2 > 1) {
      regim2 = 0;
    }
  }
  if (btnPress2 == HIGH && lastbtnStat2 == true) {
    lastbtnStat2 = false;
  }

  if (regim2 == 0 && regim1 == 0) {
    Status1 = true;
    digitalWrite(RELAY_1, Status1);
    led1.off();
    led2.off();
  }
   if (regim2 == 1) {
   regim1 = 0;
   led1.off();
   led2.on();
    }
  Serial.print("Regim2:");
  Serial.println(regim2);
  Serial.print("Relay2:");
  Serial.println(Status1);
}

void setup()
{
  Serial.begin(115200);
  Blynk.begin(auth, ssid, password);
  dht.begin();

  pinMode(RELAY_1, OUTPUT);                  //Выход на реле или светодиод
  pinMode(BUTTON_1, INPUT);                  //Кнопка
  digitalWrite(RELAY_1, Status1);            //устанавливаем на выходе статус реле
  timer.setInterval(30000L, Send);
  timer.setInterval(30000L, hum);
  timer.setInterval(1000L, button1);
  timer.setInterval(1000L, button2);
  timer.setInterval(30000L, reg);
}
void loop()
{
  Blynk.run();
  timer.run();
  }

Может я еще что-то не так прописал?
 
Последнее редактирование:

Jon

Member
меня удивляет то что вы берете для кнопки порт с номером больше 10. Какой модуль ESP?
 
Последнее редактирование:

Jon

Member
У меня сам скетч работает стабильно. Попробую навесить кнопки и датчик - отпишусь.
 

Nikolaha53rus

New member
Я вижу что тема умерла, но все таки, подскажите есть ли пример в библиотеке Blynk для связи между собой 2-х esp8266? Два разных проекта.
 
Последнее редактирование:

Partizanex

New member
Даже зарегался ДЛя такого нежданого появления в 2020 году.
Nikolaha53rus
Ты хоть и был последний раз в 2017 м Но отвечу примеры есть И всем остальным кого сюда занесет рекомендую искать примеры и вообще разбор библиотеки Блинк вот тут .
Благо там есть переключатель РУ . Так вот на одной странице собрана вся инфа которая вот как тут разбросана по форумам.
 
Сверху Снизу