Files
MicroRadar60Hz/R60ABD1/ESP32_R60ABD1_http_logger/ESP32_R60ABD1_http_logger.ino

288 lines
8.4 KiB
C++

//ESP8266
//#include <ESP8266HTTPClient.h>
//#include <ESP8266WiFi.h>
//#define BrdMark "ESP8266"
//const char *ap_id = "R60_8266_01";
//const char *ap_id = "R60_GERMAN";
// target - DOIT ESP32 DEVKIT V1
#include <HTTPClient.h>
#include <WiFi.h>
#define BrdMark "ESP32"
#include <WiFiClient.h>
// office server
//#define WFSSID "TP-Link_7C38"
//#define WFPSWD "36929092"
// my home server
#define WFSSID "Keenetic-6595"
#define WFPSWD "1Q2w3e4r"
// clinica WiFI
//#define WFSSID "clinica"
//#define WFPSWD "givemeaccessnow"
// office WiFi
//#define WFSSID "MediaMetrics_2.4g"
//#define WFPSWD "germanklimenko"
// German home
//#define WFSSID "MTS_GPON_9f1ac0"
//#define WFPSWD "D9a287k9"
//const char* httpuri ="http://192.168.0.104:8080/pox";
//const char* httpuri ="http://192.168.3.14/pox";
const char* httpuri ="http://192.168.1.79/pox"; // home 25.03.2026
//const char* httpuri ="http://aim.kwam.ru:8080/pox";
//const char* httpuri ="http://195.201.126.70:8080/pox";
//const char* httpuri ="http://activity206.li.ru/cgi-bin/radar.sh"; // Владимир
const char *ap_id = "R60_02";
#define LOOP_TIME 1000
bool wifi_started = false;
// Serial2
#define RXD2 16
#define TXD2 17
#define BAUDRATE 115200
// MicRadar60 data block definitions
#define BLK_HEAD_1 85
#define BLK_HEAD_2 170
#define DATA_READ_MAX_SIZE 64
#define DATA_BLOCK_LEN 10
#define DATA_BLOCK_MASK 89 // 0x59
#define DATA_BLOCK_MASK_POS 1
#define DATA_TYPE_MASK_POS 2
#define CMD_TYPE_MASK_POS 3
#define DATA_VALUE_POS 6
#define HEAR_RATE_MASK 133 // 0x85
#define BREATH_RATE_MASK 129 // 0x81
#define SLEEP_VALUE_MASK 132 // 0x84
#define HUMAN_DETECT_MASK 128 // 0x80
#define PARSE_DATA_COUNT 4
#define PARSE_DATA_COUNT 4
enum{
hr_pos=0,
br_pos,
mv_pos,
dv_pos
};
uint8_t k=0,f=0, rf=0, rpos=0, i, s, dl=0, b1;
uint8_t data_read[DATA_READ_MAX_SIZE], data_updt_flag[PARSE_DATA_COUNT];
uint16_t data[PARSE_DATA_COUNT];
uint32_t t_last;
void setup() {
// Note the format for setting a serial port is as follows: Serial2.begin(baud-rate, protocol, RX pin, TX pin);
Serial.begin(BAUDRATE);
Serial2.begin(BAUDRATE, SERIAL_8N1, RXD2, TXD2);
pinMode(LED_BUILTIN, OUTPUT);
Serial.println("Serial Txd is on pin: "+String(TXD2));
Serial.println("Serial Rxd is on pin: "+String(RXD2));
Serial.printf("ESP32 Chip model = %s Rev %d\n", ESP.getChipModel(), ESP.getChipRevision());
Serial.print("Chip ID: ");
Serial.println(ESP.getEfuseMac());
Serial.println("Start wifi "+String(millis()));
wifi_started = startWiFiClient(); // time reading by firststart flag
if(wifi_started){
Serial.println("wifi started "+String(millis()));
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
// Получение мирового времени
Serial.print("Retrieving time: ");
configTime(0, 0, "pool.ntp.org"); // get UTC time via NTP
time_t now = time(nullptr);
while (now < 24 * 3600)
{
//Serial.print(".");
digitalWrite(LED_BUILTIN, HIGH);
delay(20);
digitalWrite(LED_BUILTIN, LOW);
delay(80);
now = time(nullptr);
//pisk(1);
}
Serial.println(now);
digitalWrite(LED_BUILTIN, HIGH);
delay(200);
digitalWrite(LED_BUILTIN, LOW);
delay(200);
digitalWrite(LED_BUILTIN, HIGH);
delay(200);
digitalWrite(LED_BUILTIN, LOW);
delay(200);
digitalWrite(LED_BUILTIN, HIGH);
delay(200);
digitalWrite(LED_BUILTIN, LOW);
delay(200);
}else{
Serial.println("can not started WiFi");
}
for(i = 0; i<PARSE_DATA_COUNT; i++){
data[i]=0;data_updt_flag[i]=0;
}
t_last = millis();
}
void loop() { //Choose Serial1 or Serial2 as required
while (Serial2.available()) {
k = uint8_t(Serial2.read());
//Serial.print(k);
//Serial.print(" ");
f=1;
if(rpos<DATA_READ_MAX_SIZE){
data_read[rpos]=k;
rpos++;
}
}
if(f==1){
//Serial.println(" ==================== ");
if(rpos>=DATA_BLOCK_LEN){
//if(data_read[DATA_BLOCK_MASK_POS]==DATA_BLOCK_MASK){
/*
if(data_read[DATA_TYPE_MASK_POS]==HUMAN_DETECT_MASK ){ //HUMAN_DETECT_MASK HEAR_RATE_MASK
for(i=0;i<rpos;i++){Serial.print(data_read[i]);Serial.print(" ");}
Serial.println();
}
*/
switch(data_read[DATA_TYPE_MASK_POS]){
case HEAR_RATE_MASK:
//Serial.println("Heart block. ");
if(data_read[CMD_TYPE_MASK_POS] == 2){ // частота сердечных сокр-й
data[hr_pos] = data_read[DATA_VALUE_POS];
data_updt_flag[hr_pos] = 1;
}
break;
case BREATH_RATE_MASK:
//Serial.println("Breath block. ");
data[br_pos] = data_read[DATA_VALUE_POS];
data_updt_flag[br_pos] = 1;
break;
case HUMAN_DETECT_MASK:
//Serial.println("Human detect block. ");
if(data_read[CMD_TYPE_MASK_POS] == 3){ // движение тела
data[mv_pos] = data_read[DATA_VALUE_POS];
data_updt_flag[mv_pos] = 1;
}
if(data_read[CMD_TYPE_MASK_POS] == 4){ // расстояние до тела тела
data[dv_pos] = data_read[DATA_VALUE_POS]*256+data_read[DATA_VALUE_POS+1];
data_updt_flag[dv_pos] = 1;
}
break;
}
//}
//Serial.println();
}
f=0;
rf=0;
rpos=0;
}
if((millis() - t_last) >= LOOP_TIME){
bool rez = sendData();
Serial.print("Heart rate: ");
Serial.print(data[hr_pos]);Serial.print(" / ");Serial.print(data_updt_flag[hr_pos]);
Serial.print(", Breath rate: ");
Serial.print(data[br_pos]);Serial.print(" / ");Serial.print(data_updt_flag[br_pos]);
Serial.print(", Distance: ");
Serial.print(data[dv_pos]);Serial.print(" / ");Serial.print(data_updt_flag[dv_pos]);
Serial.print(", Motion value: ");
Serial.print(data[mv_pos]);Serial.print(" / ");Serial.print(data_updt_flag[mv_pos]);
Serial.print(" | ");
s = 0;
for(i = 0; i<PARSE_DATA_COUNT; i++){
Serial.print(data_updt_flag[i]);
s+=data_updt_flag[i];
}
Serial.print(" [ "); Serial.print(s);
for(i = 0; i<PARSE_DATA_COUNT; i++){
data_updt_flag[i]=0;
}
s=0;
for(i = 0; i<PARSE_DATA_COUNT; i++){
s+=data_updt_flag[i];
}
Serial.print(" / "); Serial.print(s); Serial.print(" ]");
t_last = millis();
Serial.println();
}
}
bool sendData(){
// send data to host
WiFiClient client;
time_t now = time(nullptr);
char fstr[16];
String ds = ap_id;
sprintf(fstr,"%lu", now);
ds += ", ";
ds += fstr;
sprintf(fstr,"%i", data[hr_pos]);
ds += ", ";
ds += fstr;
sprintf(fstr,"%i", data_updt_flag[hr_pos]);
ds += ", ";
ds += fstr;
sprintf(fstr,"%i", data[br_pos]);
ds += ", ";
ds += fstr;
sprintf(fstr,"%i", data_updt_flag[br_pos]);
ds += ", ";
ds += fstr;
sprintf(fstr,"%i", data[dv_pos]);
ds += ", ";
ds += fstr;
sprintf(fstr,"%i", data_updt_flag[dv_pos]);
ds += ", ";
ds += fstr;
sprintf(fstr,"%i", data[mv_pos]);
ds += ", ";
ds += fstr;
sprintf(fstr,"%i", data_updt_flag[mv_pos]);
ds += ", ";
ds += fstr;
ds += ", ";
ds += BrdMark;
HTTPClient http; //Объявить объект класса HttpClient
http.begin(client, httpuri); //Укажите адрес запроса
http.addHeader("Content-Type", "text/plain"); //Укажите заголовок типа содержимого
http.addHeader("Title", ds); // так передадим ID датчика
Serial.println("Send data:");
Serial.println(ds);
int httpCode = http.POST(ds); //Отправьте запрос
String payload = http.getString(); //Получите полезную нагрузку ответа
Serial.println("HTTP answer:");
Serial.println(httpCode); //Распечатать код возврата HTTP
Serial.println(payload); //Полезная нагрузка для ответа на запрос печати
http.end(); //Закрыть соединение
if(httpCode==200){
return(true);
}else{
return(false);
}
return(true);
}
bool startWiFiClient()
{
WiFi.mode( WIFI_STA);
WiFi.begin(WFSSID, WFPSWD);
int try_cnt = 0;
while ( WiFi.status() != WL_CONNECTED ) {
try_cnt++;
Serial.print(".");
delay ( 100 );
if(try_cnt>100){return(false);}
}
Serial.println("Connected");
return(true);
}