Не удается заставить Wi-Fi модуль esp8266-12 всегда точно считывать входящее напряжение analogRead

Итак, у меня есть и arduino uno, который запускает выход на вывод 8. Этот код не находится в этом файле просто для ясности. Оттуда я беру этот вывод и с его помощью запускаю пин 0 на модуле Wi-Fi. Я использую pin 0, потому что из того, что я понимаю, у всех других контактов есть pullup или pulldown резистор. Когда pin 0 горячий, я хочу распечатать это значение. Иногда это работает, когда я делаю это в других случаях аналоговые значения считываются очень низко. Я использую 3,3 В от arduino uno, и я планирую получить регулятор напряжения для модуля wifi, но вызовет ли это такую проблему? Я новичок в arduino, поэтому, если у кого-то есть какие-либо идеи, я был бы признателен за очень тупое объяснение. Большое спасибо. Кроме того, причина, по которой у меня задержка выключена так низко, заключается в том, что это, казалось, заставляло аналоговый сигнал подниматься чаще. Я не уверен, почему это будет иметь значение, но при задержке 3000 он почти никогда не изменит аналоговое значение, но когда я уменьшил задержку до одного, значение прошло гораздо более последовательно. В настоящее время код просто выводит низкие аналоговые числа и иногда всплывает 1023, когда напряжение подается, но не последовательно. И иногда это просто прекращается совсем, пока я продолжаю пытаться какое-то время. Я получаю напряжение на контакт, однако, поэтому я знаю, что у меня есть полная схема и мощность.

включить

#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>

const char* ssid = "ENDOWED Underwear";
const char* password = "endowwear";

HTTPClient http;

static const uint8_t D0   = 16;
static const uint8_t D1   = 5;
static const uint8_t D2   = 4;
static const uint8_t D3   = 0;
static const uint8_t D4   = 2;
static const uint8_t D5   = 14;
static const uint8_t D6   = 12;
static const uint8_t D7   = 13;
static const uint8_t D8   = 15;
static const uint8_t D9   = 3;
static const uint8_t D10  = 1;

int featherPin = D3;

void setup() {
  Serial.begin(115200);
  pinMode(featherPin, INPUT);

  WiFi.begin(ssid, password);

  while(WiFi.status() != WL_CONNECTED) {
    delay(10);
    Serial.println("Waiting for connection");
  }
}

void loop() {
  int sensorValue = analogRead(featherPin);

  if (WiFi.status() == WL_CONNECTED) {
        Serial.println("yay connect");

        http.begin("http://10.150.40.121:3000/");
        http.addHeader("Content-Type", "text/plain");

        int httpCode = http.POST("Message from ESP8266");
        String payload = http.getString();
//        Serial.println(payload);
        http.end();

    } else {
        Serial.println("Error in Wifi connection"); 
    }

    if (sensorValue > 850) {

      http.begin("http://10.150.40.121:3000/home");
      http.addHeader("Content-Type", "text/plain");

      int httpCode = http.POST("Message from ESP8266");
      String payload = http.getString();
      Serial.println(payload);
      Serial.print("hi");
      http.end();
      } else if (sensorValue < 850) {
        Serial.print(sensorValue);
//        Serial.println("I am not hot");
      } 


//  digitalWrite(trigPin, LOW);
//  delayMicroseconds(1);
//  digitalWrite(trigPin, HIGH);
//  delayMicroseconds(2);
//  digitalWrite(trigPin, LOW);
//
//  pinMode(echoPin, INPUT);
//  duration = pulseIn(echoPin, HIGH);
//
//  inches = (duration / 2) / 74;
//  Serial.println(inches);
//
//  spaceIntruded = inches;
//  
//  if (spaceIntruded <= 50 || spaceIntruded >= 900){
//      digitalWrite(ledPin, HIGH);
//      digitalWrite(hornPin, HIGH); 
//      Serial.println("Intruder Detected!");
//      Serial.println("Sending text Notification...");
//      delay(500);
//      Serial.println("Armed...");
//  }
//  
//  else{
//    digitalWrite(hornPin, LOW);
//    digitalWrite(ledPin, LOW);
//  }
    delay(1);

}

, 👍1

Обсуждение

`Когда контакт 0 горячий, я хочу напечатать это значение"...? Какая ценность? Что вы имеете в виду под "горячим"?, @Majenko

Когда вывод 0 на Arduino uno горячий, то есть к нему приложено 3,3 В, я хочу аналогизировать изменение значения. Если напряжение не подается, оно должно считываться как номер партии, а когда подается напряжение, оно должно считываться как высокое число, и иногда это происходит, но оно никоим образом не согласуется. Я не уверен, что это потому, что я беру 3,3 В от arduino uno, но я также попытался взять его от 5 В на arduino uno и погрузить его вниз с помощью регулятора напряжения, и я получаю ту же проблему. Однако это был регулируемый регулятор напряжения. Я собираюсь купить тот, который специально предназначен для 3,3 В., @user52703

Есть ли у вас контакт, подключенный к контакту аналогового входа, а также к контакту 0? Вы же знаете, что ESP8266 имеет только один аналоговый вход, и это специальный вывод, а не один из обычных выводов Dx, да?, @Majenko

Нет, я этого не делал, и я не понял, что вы имеете в виду под DX-контактом, и у меня есть контакты, припаянные для каждого контакта, и я очень касаюсь выхода из arduino uno на 0-контакт, и никаких последовательных изменений не происходит. На данный момент он работает вообще, но иногда он работает. Но этот штифт не соединен с аналоговым штифтом, это просто штифт. Все контакты припаяны, и я использую только контакт 0, потому что у него нет внутреннего резистора pullup pulldown. Когда я попытался использовать другие контакты, то вообще не смог заставить это значение измениться. Только когда я переключался на 0, он иногда считывал изменения., @user52703

https://www.microcenter.com/product/460313/feather-huzzah-with-esp8266-wifi Это модуль Wi-Fi, который я использую, @user52703

Контакт с надписью ADC - единственный, который можно использовать с analogRead. И если только эта плата не включает в себя делитель, она не может считывать больше 1В., @Majenko

Как вы думаете, я мог бы понизить напряжение до одного вольта и работать с ним таким образом? Я отслеживаю только одно значение или то, как бы это сделал ypu. У меня есть два файла-один для arduino uno и один для пера. Я просто хочу прочитать и проверить состояние одного контакта. Я установил датчик в программе arduino, который запускает вход и делает вывод kne на модуле Wi-Fi, чтобы я мог считывать изменение от низкого уровня к высокому. Я также мало что знаю о rx TX, но я читал, что могу разговаривать с этим модулем или должен использовать другой модуль Wi-Fi. Еще раз спасибо за помощь., @user52703

ДА. Да, можно. Гугл знает как., @Majenko

Я понимаю, что Google знает, как это сделать. Я погуглил свой путь до этого момента. Я просто ищу какого-то направления у кого-то с опытом, потому что только два дня назад начал учиться таким определенным вещам, в которых запутался. Я прочитал десятки статей, так что если бы вы могли направить меня в нужном направлении или, может быть, объяснить это с вашей точки зрения, я был бы вам очень признателен. Большое спасибо за вашу помощь., @user52703

Ключевое слово, о котором я уже упоминал, - "делитель". В частности, делитель напряжения. Основной принцип электроники, который вам нужно изучить. Однако на плате он уже может быть установлен, так что проверьте руководство или схему., @Majenko

Это круто. Спасибо. Мне это нужно. Мой последний вопрос это вывод с надписью АЦП могу ли я рассматривать этот вывод как обычное аналоговое считывание кода и знаете ли вы почему я не могу сделать цифровое считывание. Это потому, что он плавает до тех пор, пока его нет. Сейчас мне в основном любопытно. Еще раз спасибо. Это полезно., @user52703

почему вы хотите использовать АЦП esp8266, если у вас есть Uno с 5 хорошими аналоговыми входами в настройке проекта?, @Juraj

Вывод АЦП можно использовать только с функцией analogRead (). Никакой другой вывод не может этого сделать, и ничего другого нельзя сделать с выводом АЦП. Он напрямую подключен к АЦП, встроенному в микросхему, и больше ни к чему. Вы не можете использовать digitalRead(), digitalWrite(), pinMode() или analogWrite(). У него даже нет вывода для этих функций., @Majenko

Майенко прав, что единственный pin, который вы можете использовать с **analogRead**, - это pin A0. Я бы добавил, что я думаю, что вы делаете ошибку, предполагая, что любой из этих других контактов может быть использован. Я также новичок в этом, но у меня есть два блока NodeMCU ESP8266, и только несколько контактов на самом деле полезны в качестве входа или выхода. Многие контакты предназначены для других целей, таких как последовательный RX/TX, хранение и RST. Pin D3, в частности, зарезервирован для FLASH. Некоторая информация [здесь](https://randomnerdtutorials.com/esp8266-pinout-reference-gpios/)., @S. Imp

Я бы также добавил, что **analogWrite** НЕ просто устанавливает некоторый уровень напряжения на контакте. Контакты могут идти только до 0 или 3.3-т. Е. Полностью **вкл** или полностью **выкл**. Для того, чтобы *эмулировать* некоторый уровень напряжения между ними, ESP8266 будет использовать [PWM](https://en.wikipedia.org/wiki/Pulse-width_modulation), который в основном быстро включает и выключает напряжение, чтобы имитировать промежуточное напряжение., @S. Imp


1 ответ


1

Аналого-цифровое преобразование - это один из аспектов1, в котором ESP8266 очень плох. Он имеет один вывод АЦП, который может считывать максимум 1 В.

Этот контакт является единственным контактом, который вы можете использовать с analogRead(). Любые попытки использовать любой другой контакт просто используйте этот контакт вместо этого. Параметр (pin) для analogRead(pin) игнорируется, и независимо от того, что вы делаете, считывается только один контакт АЦП. Кроме того, контакт нельзя использовать ни для чего другого. Ни одна из цифровых функций не может быть использована с ним, так как с контактом не связан номер GPIO.

Некоторые платы включают простой делитель напряжения на выводе АЦП, чтобы считывать более высокое напряжение, например, NodeMCU:

Если на вашей плате нет такого разделителя, вам придется реализовать его (или что-то подобное), чтобы иметь возможность считывать входящее напряжение 3,3 В.


1 ESP8266 отлично подходит для Wi-Fi, но довольно плох для всего остального. Ему серьезно не хватает внутренних периферийных устройств (у него даже нет I2C). Для более функционального решения вы можете рассмотреть возможность обновления до ESP32.

,