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.

, 👍1


3 ответа


Лучший ответ:

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 и после включения резистора. Резистор необходим для предотвращения плавающего входа.

,

Комментарии не для расширенного обсуждения; этот разговор был [перемещен в чат] (http://chat.stackexchange.com/rooms/66558/discussion-on-answer-by-phlogratos-digitalread-not-reading-input-pin-of-esp8266)., @Majenko


-1

Есть определенные контакты, которые выводят сигнал 3,3 В при загрузке ESP8266. Это может быть проблематично, если у вас есть реле или другие периферийные устройства, подключенные к этим GPIO. Следующие GPIO выводят ВЫСОКИЙ уровень сигнал при загрузке: GPIO1, GPIO3, GPIO9, GPIO10. GPIO3: контакт должен быть высоким при BOOT и подтянут к этому положению. Я понятия не имею, что произойдет, если в этот момент будет низкий уровень. Поскольку модули ввода-вывода I2C стоят дешево, я использую их и не беспокоюсь об остальных контактах. Не самый дешевый, но избавляет меня от неприятностей. Это немного облегчает мне жизнь, так как я подтягиваю линии I2C к 3,3 В и подключаю PCF8574 к 5 Вольтам. Нет проблем, так как SCL и SCI по определению являются открытым стоком или открытым коллектором (биполярные части). Это была моя первая попытка сделать первый рабочий снимок LCSD. Я попробовал 3,3 В, но это не сработало.

,

0

Проблема возникает, когда вы пытаетесь использовать порт RX (3) и также определяете Serial.begin. Это двойное погружение. Вы можете использовать RX/TX только как единый блок цифровой или последовательной связи.

,