/**
pinMode(ledPin2, OUTPUT);
const int ledPin2 = 2;
char big_data[60000] = "val="; //Объявляет большой буфер и задаёт начальное значение
sprintf(...) //Добавляет в конец форматированную строку
memset(big_data, 0, sizeof(big_data)); //Обнуляет (очищает) строку
strcat(big_data, "val="); //Снова начинает строку с "val=" после очистки
char letter = 'X';
int number = 42;
float temp = 23.4567;
char name[] = "ESP32";
char buffer[100];
sprintf(buffer, "Char: %c, Int: %d, Float: %.2f, String: %s", letter, number, temp, name);
float some_data = %.2f
millis() = %d
String name = "ESP32";
sprintf(buffer, "Name: %s", name.c_str());
String name = "ESP32";
name.reserve(5000); // резервируем память для предотвращения фрагментации!
*/
#include <HTTPClient.h>
#include <WiFi.h>
#include <HardwareSerial.h>
HardwareSerial BMS(1);
String bmsResponseStr = ""; // ответ от бмс
String big_data = ""; // данные для отправки
byte request[512]; // массив байтов ответа
int responseLength = 0; // для подсчета длины ответа
int loop_counter = 0;
String b1;
String b2;
String b3;
String b4;
String total_voltage;
String current;
String soc;
String battery_temp;
String mosfet_temp;
String discharging_on_off;
String charging_on_off;
void wifi_connection(){
//WiFi.begin("netis_kitchen", "password");
WiFi.begin("netis_7AB60F", "password");
//WiFi.begin("netis_2.4G_007C9D", "d11v09n03");
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
WiFi.setHostname("solar_esp");
Serial.print("OK! IP=");
Serial.println(WiFi.localIP());
}
void send_http(){
Serial.println("send_http_func");
// Указываем URL и данные для POST запроса
HTTPClient http;
http.begin("https://fuguja.com/esp/solar.php");
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
// Отправляем POST запрос
float httpResponseCode = http.POST(big_data);
String payload;
if (httpResponseCode == 200) {
payload = http.getString();
}
http.end();
}
void setup() {
bmsResponseStr.reserve(10000); // резервируем 5000 бит
big_data.reserve(80000); // резервируем 5000 бит
b1.reserve(10);
b2.reserve(10);
b3.reserve(10);
b4.reserve(10);
total_voltage.reserve(10);
current.reserve(10);
soc.reserve(10);
battery_temp.reserve(10);
mosfet_temp.reserve(10);
discharging_on_off.reserve(2);
charging_on_off.reserve(2);
BMS.begin(115200, SERIAL_8N1, 16, 17);
big_data = "val=";
delay(1000);
Serial.begin(115200);
wifi_connection();
}
void loop() {
Serial.println(loop_counter);
loop_counter++;
if(loop_counter == 30){
send_http(); // отправка
Serial.println(big_data);
loop_counter = 0;
big_data = "val=";
}
byte ask[] = {
0x4E, 0x57, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00,
0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x68, 0x00, 0x00, 0x01, 0x29
};
BMS.write(ask, sizeof(ask));
delay(200); // даём BMS время ответить
responseLength = 0;
while (BMS.available()) {
byte b = BMS.read();
if (responseLength < sizeof(request)) {
request[responseLength++] = b;
}
}
b1 = String((request[14] << 8) | request[15]); // 14 значит 15 и 16
b2 = String((request[17] << 8) | request[18]); // 16 значит 17 и 18
b3 = String((request[20] << 8) | request[21]); // 19 значит 20 и 21
b4 = String((request[23] << 8) | request[24]); // 22 значит 23 и 24
total_voltage = String((request[35] << 8) | request[36]); // 83 | 34 значит 35 и 36
current = String((request[38] << 8) | request[39]); // 84 ячейка | 37 номер массива (38 39)
soc = String(request[41]); // 85 | 40 номер массива (41)
battery_temp = String((request[32] << 8) | request[33]); // 82 | 31 номер массива (32 33)
mosfet_temp = String((request[26] << 8) | request[27]); // 80 | 25 (26 b 27)
discharging_on_off = String(request[151]); // ac | 150 (151)
charging_on_off = String(request[149]); // ab | 148 (149)
big_data += "{b1:"+b1+"b2:"+b2+"b3:"+b3+"b4:"+b4+"v:"+total_voltage+"c:"+current+"soc:"+soc+"bt:"+battery_temp+"mt:"+mosfet_temp+"dch:"+discharging_on_off+"ch:"+charging_on_off+"wf:"+String(WiFi.RSSI())+"ms:"+String(millis())+"}";
delay(5000); // 10 секунд пауза перед следующим запросом
}