digitalRead не читает входной контакт ESP8266-01
Я пытаюсь использовать переключатель включения-выключения с ESP8266, чтобы изменить, является ли GPI02 ВЫСОКИМ или НИЗКИМ. Я использую GPIO3 в качестве входа. Моя схема выглядит так:
Красная область справа — это реле, я не был уверен, как заставить его работать в fritzing, но я уверен, что оно подключено правильно, у него просто есть сигнал, + и -, контакт. Более важные вещи происходят с ESP8266. Во-первых, вот код:
/*
Это простой пример библиотеки aREST для чипа WiFi ESP8266.
Этот пример иллюстрирует облачную часть REST, которая делает плату доступной из любого места.
Подробности смотрите в файле 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";
// Функции
void callback(char* topic, byte* payload, unsigned int length);
void setup(void)
{
// Установить входной/выходной пин
pinMode(3, INPUT);
pinMode(2, OUTPUT);
//pinMode(2, ВЫХОД);
// цифровая запись (3, 0);
// Начать сериал
Serial.begin(115200);
// Установить обратный вызов
client.setCallback(callback);
// Задать имя & ID к устройству (ID должен состоять из 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(3);
Serial.println(read3 + " input");
digitalWrite(2, read3);
}
// Обрабатывает сообщение, пришедшее в подписанную тему(ы)
void callback(char* topic, byte* payload, unsigned int length) {
Serial.println("request from interwebs");
rest.handle_callback(client, topic, payload, length);
}
Вывод Serial.println
всегда является вводом
(перед вводом нет ни HIGH, ни LOW, ни 1, ни 0, ни чего бы то ни было. I проверили, что переключатель работает. В положении on
он посылает 3.3v
на GPIO3 (я измерил это с помощью своего мультиметра), и тем не менее вход никогда не меняется. в положении off
он отправляет 0 В, а ESP8266 просто действует так, как будто читать нечего, так как я использую это с aREST
, и вы можете установить режим контактов из-за этого я подумал, что, возможно, мне нужно установить pinMode
с запросом aREST
cloud.arest.io/xxxxx/mode/3/i
и он подтверждает с помощью ответа JSON, что вывод настроен на ввод, но по-прежнему не считывается.Разве у меня неправильно подключен ESP8266 для этого?Может быть, мне нужны подтягивания/подтягивания или я не могу использовать выводы в конфигурации, которую я использую?Еще одна вещь, когда я устанавливаю входной контакт с aREST, он включается реле (отправляя что-то через GPIO2 по какой-то причине). Если я не устанавливаю вход с помощью aREST
, реле остается выключенным.
ОБНОВЛЕНИЕ
Я попытался с помощью этого кода исключить, что это может быть aREST
:
void setup() {
// put your setup code here, to run once:
pinMode(3, INPUT);
pinMode(2, OUTPUT);
// Start Serial
Serial.begin(115200);
}
void loop() {
// put your main code here, to run repeatedly:
int read3 = digitalRead(3);
Serial.print(read3);
Serial.println(" input");
digitalWrite(2, read3);
}
Он всегда выводит 0 input
, похоже, что ESP8266 игнорирует этот входной контакт.
ОБНОВЛЕНИЕ
Сейчас я пытаюсь использовать GPIO0 в качестве входа. У меня переключатель подключен к земле, и он ведет к GPIO0. Когда я включаю его, GPIO0 читает 1
(включено), затем я использую переключатель, и он правильно отключает реле, затем я снова пытаюсь включить его, и ничего не происходит, GPIO0 продолжает быть читать в 0
. Поэтому я не могу использовать переключатель после первоначального off
.
@ewizard, 👍1
3 ответа
Лучший ответ:
Выражение read3 + "input"
выполняет арифметику указателя, т. е. вы либо добавляете 0, либо 1 к начальному адресу " input"
, поэтому вы получаете либо "ввод"
или "ввод"
. Исчезает ли начальный пробел при нажатии кнопки?
Чтобы исправить код, вы можете распечатать номер отдельно:
Serial.print(read3);
Serial.println(" input");
Вы должны избавиться от остального кода и кода pub-sub. Вы можете добавить это позже, после решения проблемы с кнопкой.
Также обратите внимание, что GPIO03 использует тот же контакт, что и RX. В документах указано следующее:
Serial uses UART0, which is mapped to pins GPIO1 (TX) and GPIO3 (RX).
Таким образом, это должно работать после отключения Serial и после включения резистора. Резистор необходим для предотвращения плавающего входа.
Есть определенные контакты, которые выводят сигнал 3,3 В при загрузке ESP8266. Это может быть проблематично, если у вас есть реле или другие периферийные устройства, подключенные к этим GPIO. Следующие GPIO выводят ВЫСОКИЙ уровень сигнал при загрузке: GPIO1, GPIO3, GPIO9, GPIO10. GPIO3: контакт должен быть высоким при BOOT и подтянут к этому положению. Я понятия не имею, что произойдет, если в этот момент будет низкий уровень. Поскольку модули ввода-вывода I2C стоят дешево, я использую их и не беспокоюсь об остальных контактах. Не самый дешевый, но избавляет меня от неприятностей. Это немного облегчает мне жизнь, так как я подтягиваю линии I2C к 3,3 В и подключаю PCF8574 к 5 Вольтам. Нет проблем, так как SCL и SCI по определению являются открытым стоком или открытым коллектором (биполярные части). Это была моя первая попытка сделать первый рабочий снимок LCSD. Я попробовал 3,3 В, но это не сработало.
Проблема возникает, когда вы пытаетесь использовать порт RX (3) и также определяете Serial.begin. Это двойное погружение. Вы можете использовать RX/TX только как единый блок цифровой или последовательной связи.
- Какие входные контакты я могу использовать на ESP8266 NodeMCU
- Можно ли использовать SoftwareSerial в ESP01
- Код запускается, но не запускается после добавления подпрограммного кода
- Использовать все контакты как цифровые входы/выходы
- Что такое ICSP pin (разъём)?
- AT-команда не отвечает на последовательный монитор
- Отправка данных Arduino в MySQL с помощью phpMyAdmin и XAMPP на Windows10
- Arduino выводит значения мусора на serial monitor с ESP8266
Комментарии не для расширенного обсуждения; этот разговор был [перемещен в чат] (http://chat.stackexchange.com/rooms/66558/discussion-on-answer-by-phlogratos-digitalread-not-reading-input-pin-of-esp8266)., @Majenko