Код запускается, но не запускается после добавления подпрограммного кода
Я программирую 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);
}
@ewizard, 👍0
Обсуждение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;
}
,
@ewizard
Смотрите также:
- Отправка данных из ESP8266 в PHP
- digitalRead не читает входной контакт ESP8266-01
- Скетч мигания ESP8266 не мигает светодиодом
- Как программно получить ответ на выданную AT-команду для ES266 на Arduino?
- nodeMCU — 2 цикла одновременно — один непрерывно, второй каждые 10 секунд.
- Вызов метода в основном скетче из библиотеки.
- Как получить данные из цикла?
- Печать string and integer LCD
я обновил свой вопрос, добавив полный эскиз, @ewizard
Я почти уверен, что контакты 3 и контакт 1 предназначены для последовательного порта esp8266., @ewizard
контакт 0 - это просто gpio... все, что я делаю, чтобы он не работал, это добавляю переменную bool вверху, объявление и оператор if, а также места, где устанавливается значение bool., @ewizard
да, я не понимаю, как то, что я добавляю, может его сломать, есть ли две переменные bool, объявленные вверху? или, может быть, мне нужно где-то добавить задержку?, @ewizard