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

Нужна помощь Помогите с кнопкой, плиз

Neznayka

New member
Я регулярно захожу на этот сайт как начинающий, почитать, что для себя интересного подсмотреть.
Помогите мне, изменить пару строк, код не мой, мне нужен алгоритм работы, не при включении отправлять сообщение на мэил, с этим я разобрался всё отлично тут. А отправлять по высокому уровню на пине 5, который я пытаюсь добавить. Если для кого кто знает, это 2 минуты , помогите... Пожелание, я читал тут не один пост с издёвками типа тебе за 500р любой напишет, или вот пример из гугла, просьба нет желания помочь, не пишите мне, надо этого. Заранее спасибо за понимание.
Вот код который я пытаюсь под себя переделать в цикле в строке 104, (97 убирается ), при опросе кнопки, мне не понятно. И можно ли эту функцию так использовать
Код:
//подаем питание на контроллер на время отработки кода. //
//светодиод для сигнализирования успешной передачи сообщения. //
//на 13 пине св диод сигнализирует о удачной отправке  на 5  сек //

#include <ESP8266WiFi.h>
#include "Gsender.h"

#pragma region Globals

#define INPUT_PIN 5

IPAddress ip(192, 168, 1, 100); //Node static IP
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);

const char* host = "Mail";
const char* ssid = "********";      // имя вашейсети
const char* password = "a********"; // пароль сети

uint8_t connection_state = 0;                   
uint16_t reconnect_interval = 20000; // если не удалось связаться - повторим через 10 секунд

#pragma endregion Globals

uint8_t WiFiConnect(const char* nSSID = nullptr, const char* nPassword = nullptr)
{
    static uint16_t attempt = 0;
    Serial.print("Connecting to ");
    if(nSSID) {
        WiFi.begin(nSSID, nPassword); 
        Serial.println(nSSID);
    } else {
        WiFi.begin(ssid, password);
        Serial.println(ssid);
    }

    uint8_t i = 0;
    while(WiFi.status()!= WL_CONNECTED && i++ < 100)
    {
        delay(200);
        Serial.print(".");
    }
    ++attempt;
    Serial.println("");
    if(i == 101) {
        Serial.print("Connection: TIMEOUT on attempt: ");
        Serial.println(attempt);
        if(attempt % 2 == 0)
            Serial.println("Check if access point available or SSID and Password\r\n");
        return false;
    }
    Serial.println("Connection: ESTABLISHED");
    Serial.print("Got IP address: ");
    Serial.println(WiFi.localIP());
    return true;
}

void Awaits()
{
    uint32_t ts = millis();
    while(!connection_state)
    {
        delay(100);
        if(millis() > (ts + reconnect_interval) && !connection_state){
            connection_state = WiFiConnect();
            ts = millis();
        }
    }
}

void setup()
{
pinMode(INPUT_PIN, INPUT);
digitalWrite(INPUT_PIN, LOW); 
    pinMode(13, OUTPUT);
    Serial.begin(115200);
    WiFi.mode(WIFI_STA);
    WiFi.config(ip, gateway, subnet);
    connection_state = WiFiConnect();
    if(!connection_state)  // if not connected to WIFI
        Awaits();          // constantly trying to connect

    Gsender *gsender = Gsender::Instance();    // Getting pointer to class instance
    String subject = "ESP8266 send mesege";

  content += "<p>.<p>";
  content += "<p>TEXT...XXXX.......TEXT<p>";

   
    if(gsender->Subject(subject)->Send("********@mail.ru", content)) {
        Serial.println("Message send.");
  digitalWrite(13, HIGH);  // включаем зеленый светодиод - все ОК
  delay(2000);
  digitalWrite(13, LOW);  // вылючаем зеленый светодиод
    } else {
        Serial.print("Error sending message: ");
        Serial.println(gsender->getError());
    }
}

void loop(){
  if(digitalRead(INPUT_PIN)==HIGH) {
    Serial.println("5p  +1 now ");
/////    gsender->Subject(subject)->Send("altar71@mail.ru", content) {
 Serial.println("Message send.");
  }
}
 

Neznayka

New member
C кнопкой Я разобрался сам таким образом
Код:
void loop(){

if(digitalRead(INPUT_PIN)==HIGH)
{
  Gsender *gsender = Gsender::Instance();    // Getting pointer to class instance
  String subject = "ESP8266 send mesege";
 String  content = "";
 content += "<p>TEXT...XX......TEXT<p>";
  Serial.println(" ");
  Serial.println("5pin  +1 now ");
  if(gsender->Subject(subject)->Send("*********", content)) {
    Serial.println("Message send.");
  }
  else {
    Serial.print("Error sending message: ");
    digitalWrite(13, HIGH);  // включаем зеленый светодиод - все ОК
   delay(1000);
   digitalWrite(13, LOW);  // вылючаем зеленый светодиод
    Serial.println(gsender->getError());
  }
}
delay(2000);
}
Вопрос в следующем, как сделать чтобы сообщения не сыпались каждую секунду, при +1 на 5 пине а отправилось одно тайм аут скажем 2 минуты и перейти в обычное состояние, \дэлэй\ в конце исключается, там есть ещё кнопки и термометр, которые продолжают работать. Спасибо
 

Antynik

Member
Я бы посоветовал после отправки delay(10000) воткнуть. Самый тупой и надёжный способ убрать дребезг.
 

Сергей_Ф

Moderator
Команда форума
@Neznayka вариантов несколько.
1. Ввести понятие состояние кнопки, а передавать только изменения состояния с одного на другое.
2. Засекать время нажатия и до истечения таймаута больше не реагировать на нажатия.

Все варианты есть в примерах Ардуино ИДЕ.
 

Neznayka

New member
@Neznayka вариантов несколько.
1. Ввести понятие состояние кнопки, а передавать только изменения состояния с одного на другое.
2. Засекать время нажатия и до истечения таймаута больше не реагировать на нажатия.

Все варианты есть в примерах Ардуино ИДЕ.
Так не получится.... , ещё есть условия по превышению температуры и просадки по питанию 12вольт
 

Сергей_Ф

Moderator
Команда форума
ещё есть условия по превышению температуры и просадки по питанию 12вольт
А это тут при чём? Я отвечал на конкретный вопрос. Более того, оба способа ничему не мешают. Есть событие - обработали и пошли дальше, нет - просто прошли мимо обработки далее. Как засекать время уже подсказали выше.
 
Последнее редактирование:

Neznayka

New member
А это тут при чём? Я отвечал на конкретный вопрос. Более того, оба способа ничему не мешают. Есть событие - обработали и пошли дальше, нет - просто прошли мимо обработки далее.
Всё логично, сделал одно, подумал...., добавил другое. Работает, но пока не то что я хочу
 

Сергей_Ф

Moderator
Команда форума
@Neznayka то что в переменную unsigned long помещается ограниченное число миллисекунд. Это значение составляет около 72 часов.
 

Neznayka

New member
@Neznayka то что в переменную unsigned long помещается ограниченное число миллисекунд. Это значение составляет около 72 часов.
У меня вот такой вариант, уже 4й месяц не выключаясь не зависает
Код:
//SETUP BUTTON
unsigned long previousMillis = 0;
#define key_DELAY 40000
long t1_button;
bool last1_button;
long t1_now

...................................................................

//Check button
t1_now = millis();
  bool b1 = digitalRead( INPUT_PIN );
  if( b1 != last1_button && t1_now - t1_button > key_DELAY ){
    if( b1==HIGH && last1_button==LOW ){
      Serial.println("INPUT_PIN");
    }
    t1_button = t1_now;
    last1_button = b1;
  }
Я и тут мог бы это прикрутить но мы не ищем лёгких путей
 
Сверху Снизу