如何将 ESP32 连接到 A6 GSM 模块?

How can I connect an ESP32 to an A6 GSM module?

我真的需要帮助解决这个问题,正如最常被建议的那样,我已经研究、研究、研究了好几天,但我不知道出了什么问题……

话虽这么说,我正在做一个使用 ESP-32S 的项目 (pinout) and an A6 GSM module. (pinout),我试图让它们连接起来让 A6 将数据发送到 ThingSpeak...我的问题是我无法让它工作......我使用 ESP8266 在两者之间有完全相同的配置并且它连接并工作但是对于 ESP32S 它似乎不起作用......

下面是我用来将 32 连接到 A6 的代码,一切都显示成功并通过,但它不会使用任何方法更改任何 ThingSpeak 值...

#define TINY_GSM_MODEM_A6

#include "TinyGsmClient.h"
#include "ThingSpeak.h"


#define SerialMon Serial

HardwareSerial SerialAT(1);

bool modemConeted;

// Your GPRS credentials
// Leave empty, if missing user or pass
const char apn[]  = "wireless.twilio.com";
const char user[] = "";
const char pass[] = "";

bool dataSent = false;

TinyGsm modem(SerialAT);

TinyGsmClient client(modem);

void setup(){
  SerialMon.begin(9600);
  delay(1000);
  gsmModSetup();
}

void gsmModSetup() {

  // Set GSM module baud rate
  SerialAT.begin(9600, SERIAL_8N1, 27, 26, false); //27 and 26 are the pins on the ESP32S connected to the U_Rxd/U_Txd pins of A6
  delay(3000);

  SerialMon.println("Initializing modem...");
  modem.init();
  delay(3000);

  String modemInfo = modem.getModemInfo();
  SerialMon.print("Modem: ");

  SerialMon.println(modemInfo);


  SerialMon.print("Waiting for network...");
  if (!modem.waitForNetwork()) {
    SerialMon.println(" fail");
    delay(10000);
    return;
  }
  SerialMon.println(" OK");
  SerialMon.print("Connecting to ");
  SerialMon.print(apn);

  if (!modem.gprsConnect(apn, user, pass)) {
    SerialMon.println(" fail");
    delay(5000);
    return;
  }
  SerialMon.println(" OK");
}

void loop(){

}

我使用的是加载了数据的 Twilo Sim 卡(如上所述,它适用于 esp8266,因此不适用于 SIM 而不是板)此代码中唯一未通过的部分是说GPRS 连接。它从不说通过或失败。它只停留了大约五分钟,然后继续。

在此之后,我尝试 post 到 ThingSpeak,它给出了 ThingSpeak ERROR-307,这意味着无法连接到 ThingSpeak... 我尝试了两种不同的方式

我觉得简单又正常的方法

ThingSpeak.setField(1, temp);
ThingSpeak.setField(2, h);
ThingSpeak.setField(3, p);
ThingSpeak.setField(4, pt);
ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);

连接到服务器的更复杂的方法是发送一个 GET 命令,其中包含所有值和字符串。

if (client.connect(thingSpeakAddress, 80))
  {
    client.print("POST /update HTTP/1.1\n");
    client.print("Host: api.thingspeak.com\n");
    client.print("Connection: close\n");
    client.print("X-THINGSPEAKAPIKEY: " + WriteAPIKey + "\n");
    client.print("Content-Type: application/x-www-form-urlencoded\n");
    client.print("Content-Length: ");
    client.print(thingSpeakData.length());
    client.print("\n\n");

    client.print(thingSpeakData);

  }
client.stop();

但都不起作用,我不知道该怎么做...我的 A6 使用 GPIO26 和 27 连接到 32,它们连接到 A6 U_Rxd/U_Txd 引脚。所有董事会都应该有共同点。

任何更多的阅读指南或更改代码或尝试使用的库都会非常有帮助,因为我的挖掘天除了一次又一次的尝试失败而感到沮丧之外一无所获。这篇文章的读者真的是我解决这个阻碍我进一步进步的问题的最后希望。

(关于我这边的任何问题,请询问。-谢谢)

随附的文档显示了硬件串行 0 RX/TX 引脚 GIPO01/GIPO03 上的 ESP32S 引脚,引脚 GIPO09/GIPO10 上的硬件串行 1 RX/TX 假设您没有附加其他硬件目前,为什么不尝试使用 serial1
的基本配置阅读此内容:https://github.com/G6EJD/ESP32-Using-Hardware-Serial-Ports 并使用最新的核心 ESP32 包(截至今天 2020 年 3 月 23 日是 1.04,之前的版本在 serial 方面存在问题. 不要忘记设置文章中给出的序列号,它与 esp8266 (!) 的代码兼容性有很大不同。如果您在两个平台上都使用代码,则必须使用

#ifdef ESP32
          //configure serial for esp32
#elif ESP8266
        //configure serial for esp8266
#else
#error "Hardware not supported"
#endif

这是一个仅用于串行通信的小测试例程。如果您在串行监视器的输入行中键入内容,它应该反映在输出中 window

#include <HardwareSerial.h>

void setup() {
  Serial.begin(9600);
  // set the data rate for the HardwareSerial port
  Serial2.begin(9600);
}

void loop() {
  if (Serial2.available()) {
    Serial.write(Serial2.read());
  }
  if (Serial.available()) {
    Serial2.write(Serial.read());
  }
}

然后您可以将 serial2 扩展到您的设置。如果失败,可能是由于: U1UXD 未使用,可用于您的项目。不过有些开发板使用此端口进行 SPI 闪存访问 - 所以请尝试使用 Serial3。