Код запускается, но не запускается после добавления подпрограммного кода

Я программирую ESP8266-01.

У меня есть этот код, который я использую для управления двухпозиционным выключателем, который используется в качестве переключателя блокировки, когда реле включается и выключается через Интернет:

void loop() {

  // Подключаемся к облаку
  rest.handle(client);

  // поместите сюда свой основной код для многократного запуска:
  int read3 = digitalRead(0);

  Serial.print(read3);
  Serial.println(" input (1 is off)");

  if(read3 == 0) {
    if(pressed2) {
      Serial.println("in on");
      digitalWrite(2, 1);
      pressed = true;
      pressed2 = false;
    }
  }
  else {
    Serial.println("in off");
    if(pressed) {
      Serial.println("in off once");
      digitalWrite(2, 0);
      pressed = false;
      pressed2 = true;
    }
  }
}

Приведенный выше код никогда не запускается (на последовательный порт ничего не выводится), и реле включается. Дело в том, что этот код работает:

void loop() {  

  // Подключаемся к облаку
  rest.handle(client);

  // поместите сюда свой основной код для многократного запуска:
  int read3 = digitalRead(0);

  Serial.print(read3);
  Serial.println(" input (1 is off)");

  if(read3 == 0) {
    Serial.println("in on");
    digitalWrite(2, 1);
    pressed = true;    
  }
  else {
    Serial.println("in off");
    if(pressed) {
      Serial.println("in off once");
      digitalWrite(2, 0);
      pressed = false;
    }
  }
}

По сути, код настроен таким образом, что вывод не читается после первого экземпляра экземпляра, в котором он прочитан (это то, что bool нажал помогает сделать).

Почему первая версия не работает?

ОБНОВЛЕНИЕ

Весь рабочий скетч:

/*
Это простой пример библиотеки aREST для чипа ESP8266 WiFi.
Этот пример иллюстрирует облачную часть aREST, которая делает плату доступной из любого места.
Более подробную информацию смотрите в файле README.

Написано в 2015 году Марко Шварцем по лицензии GPL.
*/

// Импортируем необходимые библиотеки
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <aREST.h>

// Клиенты
WiFiClient espClient;
PubSubClient client(espClient);

// Создаём экземпляр REST
aREST rest = aREST(client);

// Уникальный идентификатор для идентификации устройства для cloud.arest.io
char* device_id = "ew1zard";

// параметры Wi-Fi
const char* ssid = "MaisonBlanche";
const char* password = "7932gLBw";

bool pressed = true;

// Функции
void callback(char* topic, byte* payload, unsigned int length);

void setup(void)
{
  // Устанавливаем входной/выходной контакт
  pinMode(0, INPUT);
  pinMode(2, OUTPUT);

  // Начать сериал
  Serial.begin(115200);

  // Устанавливаем обратный вызов
  client.setCallback(callback);

  // Даем имя & Идентификатор устройства (идентификатор должен состоять из 6 символов)
  rest.set_id(device_id);
  rest.set_name("esp8266");

  // Подключаемся к Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  // Устанавливаем тему вывода
  char* out_topic = rest.get_topic();
}

void loop() {

  // Подключаемся к облаку
  rest.handle(client);

  // поместите сюда свой основной код для многократного запуска:
  int read3 = digitalRead(0);

  Serial.print(read3);
  Serial.println(" input (1 is off)");

  if(read3 == 0) {
    Serial.println("in on");
    digitalWrite(2, 1);
    pressed = true;    
  }
  else {
    Serial.println("in off");
    if(pressed) {
      Serial.println("in off once");
      digitalWrite(2, 0);
      pressed = false;
    }
  }
}

// Обрабатывает сообщение, поступившее в подписанную тему(ы)
void callback(char* topic, byte* payload, unsigned int length) {

  Serial.print("request from interwebs: ");
  Serial.println(topic);
  rest.handle_callback(client, topic, payload, length);

}

, 👍0

Обсуждение

я обновил свой вопрос, добавив полный эскиз, @ewizard

Я почти уверен, что контакты 3 и контакт 1 предназначены для последовательного порта esp8266., @ewizard

контакт 0 - это просто gpio... все, что я делаю, чтобы он не работал, это добавляю переменную bool вверху, объявление и оператор if, а также места, где устанавливается значение bool., @ewizard

да, я не понимаю, как то, что я добавляю, может его сломать, есть ли две переменные bool, объявленные вверху? или, может быть, мне нужно где-то добавить задержку?, @ewizard


1 ответ


1

Я использовал это — по сути, оно делает то же самое, просто перемещается туда, где были логические переменные.

if(read3 == 0) {
    if(pressed2) {
      Serial.println("in on");
      digitalWrite(2, 1);
      pressed2 = false;
    }
    pressed = true;
  }
  else {
    Serial.println("in off");
    if(pressed) {
      Serial.println("in off once");
      digitalWrite(2, 0);
      pressed = false;
    }
    pressed2 = true;
  }
,