288 lines
8.4 KiB
Arduino
288 lines
8.4 KiB
Arduino
|
|
//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);
|
||
|
|
}
|