当esp32连接到蓝牙或者wife时,连接引脚后一些模块(光敏电阻,传感器之类)读不出模拟值的解决方法

本文档描述了在ESP32微控制器上,当连接WiFi后使用analogRead()函数读取光敏电阻模拟值时遇到的问题,即读取值始终为0或4095。问题源于在使用WiFi或蓝牙时,ADC2引脚不可用,只能通过ADC1的特定引脚读取正确值。代码示例展示了如何连接WiFi、OneNet平台,并定时发送模拟值,但遇到了数据变化不正常的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我是连接onenet平台上传光敏电阻的模拟值,当连接wife后用analogRead()函数读出来的全是0或者全是4095(就是没有数值变化)

 模拟值一直为0的原因:ESP32芯片中有ADC1和ADC2两个A/D转换器。使用Wi-Fi或蓝牙时,无法使用ADC2引脚。连接到ADC1的针脚正常工作,它们是GPIO32-36和GPIO39,此时才可以读出正确的模拟值

连上wife和onenet的代码如下:

#include <Arduino.h>
#include "WiFi.h"
#include "PubSubClient.h"
#include "Ticker.h"
#define sensorPin 35
int value=0;
const char *ssid = "baby";                 //wifi名
const char *password = "fam00201";         //wifi密码
const char *mqtt_server = "183.230.40.96"; //onenet 的 IP地址

#define mqtt_devid "945369735"  //设备ID
#define mqtt_pubid "428205"     //产品ID
#define mqtt_password "123456" //鉴权信息

WiFiClient espClient;           //创建一个WIFI连接客户端
PubSubClient client(espClient); // 创建一个PubSub客户端, 传入创建的WIFI客户端

char msg_buf[200];                                //发送信息缓冲区
char dataTemplate[] = "{\"temp\":%d,\"hum\":%d}"; //信息模板
char msgJson[75];                                 //要发送的json格式的数据
unsigned short json_len = 0;                      //json长度
Ticker tim1;                                      //定时器,用来循环上传数据

//连接WIFI相关函数
void setupWifi()
{
  delay(10);
  Serial.println("连接WIFI");
  WiFi.begin(ssid, password);
  while (!WiFi.isConnected())
  {
    Serial.print(".");
    delay(500);
  }
  Serial.println("OK");
  Serial.println("Wifi连接成功");
}

//收到主题下发的回调, 注意这个回调要实现三个形参 1:topic 主题, 2: payload: 传递过来的信息 3: length: 长度
void callback(char *topic, byte *payload, unsigned int length)
{
  Serial.println("message rev:");
  Serial.println(topic);
  for (size_t i = 0; i < length; i++)
  {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

//向主题发送模拟的光敏电阻数据
void sendTempAndHumi()
{
  int b=222;
  if (client.connected())
  {
    value=analogRead(sensorPin);
    Serial.println(value,DEC);
    delay(1000);
    snprintf(msgJson, 40, dataTemplate, value,b); //将光敏电阻数据套入dataTemplate模板中, 生成的字符串传给msgJson
    json_len = strlen(msgJson);                   //msgJson的长度
    msg_buf[0] = char(0x03);                       //要发送的数据必须按照ONENET的要求发送, 根据要求,数据第一位是3
    msg_buf[1] = char(json_len >> 8);              //数据第二位是要发送的数据长度的高八位
    msg_buf[2] = char(json_len & 0xff);            //数据第三位是要发送数据的长度的低八位
    memcpy(msg_buf + 3, msgJson, strlen(msgJson)); //从msg_buf的第四位开始,放入要传的数据msgJson
    msg_buf[3 + strlen(msgJson)] = 0;              //添加一个0作为最后一位, 这样要发送的msg_buf准备好了
    Serial.print("public message:");
    Serial.println(msgJson);
    client.publish("$dp", (uint8_t *)msg_buf, 3 + strlen(msgJson)); //发送数据到主题$dp
  }
}

//重连函数, 如果客户端断线,可以通过此函数重连
void clientReconnect()
{
  while (!client.connected()) //再重连客户端
  {
    Serial.println("重新连接");
    if (client.connect(mqtt_devid, mqtt_pubid, mqtt_password))
    {
      Serial.println("connected");
    }
    else
    {
      Serial.println("failed");
      Serial.println(client.state());
      Serial.println("try again in 5 sec");
      delay(5000);
    }
  }
}

void setup()
{
  
  Serial.begin(115200);                                  //初始化串口
  delay(3000);                                           //这个延时是为了让我打开串口助手
  setupWifi();                                            //调用函数连接WIFI
  Serial.println("连接onenet");
  client.setServer(mqtt_server, 6002);                   //设置客户端连接的服务器,连接Onenet服务器, 使用6002端口
  client.connect(mqtt_devid, mqtt_pubid, mqtt_password); //客户端连接到指定的产品的指定设备.同时输入鉴权信息
  client.setCallback(callback);                          //设置好客户端收到信息是的回调
  tim1.attach(10, sendTempAndHumi);                      //定时每20秒调用一次发送数据函数sendTempAndHumi
}

void loop()
{
  if (!WiFi.isConnected()) //先看WIFI是否还在连接
  {
    setupWifi();
  }
  if (!client.connected()) //如果客户端没连接ONENET, 重新连接
  {
    clientReconnect();
  }
  client.loop(); //客户端循环检测
}

此链接更为详细:

http://t.csdn.cn/LsnVT

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值