#include <HardwareSerial.h>
#define SerialMon Serial
#define RXD1 40 // Modem RX connected to ESP32 TX pin
#define TXD1 41 // Modem TX connected to ESP32 RX pin
#define powerPin 42 // Power pin for modem (PWRKEY pin)
HardwareSerial quectelSerial(1); // UART1 for modem
String myurl = “http://httpbin.org/post”; // URL for POST request
String payload = “{"sensor_data":[{"data_type":"CO","value":"7.80"},{"data_type":"temperature","value":"32.780"},{"data_type":"humidity","value":"13.40"}]}”;
// Function prototypes
void powerOnModem();
bool checkSignalQuality();
bool checkNetworkRegistration();
void sendPOSTRequest();
void setup() {
SerialMon.begin(115200); // Serial monitor for debugging
delay(1000);
powerOnModem(); // Power on the modem
// Initialize UART for modem communication
quectelSerial.begin(115200, SERIAL_8N1, RXD1, TXD1);
delay(1000);
// Check signal quality and network registration
if (!checkSignalQuality() || !checkNetworkRegistration()) {
SerialMon.println(“Error: Modem not ready for communication.”);
return;
}
// Send HTTP POST request
sendPOSTRequest();
}
void loop() {
// Nothing to do in loop
}
void powerOnModem() {
SerialMon.println(“Powering on the modem…”);
pinMode(powerPin, OUTPUT);
// Power-on sequence for modem
digitalWrite(powerPin, LOW); // Set PWRKEY low
delay(1000); // Wait for 1 second
digitalWrite(powerPin, HIGH); // Release PWRKEY (set high)
delay(5000); // Wait for modem to initialize
SerialMon.println(“Modem powered on.”);
}
bool checkSignalQuality() {
SerialMon.println(“Checking signal quality…”);
quectelSerial.println(“AT+CSQ”);
delay(2000);
while (quectelSerial.available()) {
String response = quectelSerial.readString();
SerialMon.println(response);
if (response.indexOf(“+CSQ:”) != -1) {
int rssi = response.substring(response.indexOf(“+CSQ:”) + 6, response.indexOf(“,”)).toInt();
if (rssi >= 15) { // Signal strength threshold
SerialMon.println(“Signal strength is sufficient.”);
return true;
} else {
SerialMon.println(“Signal strength is weak.”);
return false;
}
}
}
return false;
}
bool checkNetworkRegistration() {
SerialMon.println(“Checking network registration…”);
quectelSerial.println(“AT+CREG?”);
delay(2000);
while (quectelSerial.available()) {
String response = quectelSerial.readString();
SerialMon.println(response);
if (response.indexOf(“+CREG: 0,1”) != -1 || response.indexOf(“+CREG: 0,5”) != -1) {
SerialMon.println(“Modem is registered to the network.”);
return true;
}
}
return false;
}
void sendPOSTRequest() {
SerialMon.println(“Configuring HTTP settings…”);
// Set the URL for the HTTP POST request
quectelSerial.println(“AT+QHTTPCFG="url","” + myurl + “"”);
delay(1000);
// Set the PDP context ID
quectelSerial.println(“AT+QHTTPCFG="contextid",1”);
delay(1000);
// Enable custom request headers
quectelSerial.println(“AT+QHTTPCFG="requestheader",1”);
delay(1000);
// Enable response headers
quectelSerial.println(“AT+QHTTPCFG="responseheader",1”);
delay(1000);
// Set Content-Type header
quectelSerial.println(“AT+QHTTPCFG="header","Content-Type: application/json"”);
delay(1000);
// Set User-Agent header
quectelSerial.println(“AT+QHTTPCFG="header","User-Agent: Quectel Modem"”);
delay(1000);
// Send the POST request with the length of the payload
int payloadLength = payload.length();
SerialMon.print("Payload length: ");
SerialMon.println(payloadLength);
quectelSerial.println(“AT+QHTTPPOST=” + String(payloadLength) + “,30,60”); // 30 sec timeout
delay(500);
quectelSerial.print(payload); // Send the JSON data
delay(2000);
// Read the response from the server
quectelSerial.println(“AT+QHTTPREAD”);
delay(2000);
while (quectelSerial.available()) {
String response = quectelSerial.readString();
SerialMon.println(“HTTP Response:”);
SerialMon.println(response); // Output the HTTP response
}
}
this is the code for it but the output say 400 bad request. Please help