You are on page 1of 9

#include <DNSServer.

h>
#include <WebServer.h>
#include <ESPmDNS.h>
#include <Update.h>
#include <WiFiUdp.h>
#include "ArduinoOTA.h"
//https://github.com/esp8266/Arduino/tree/master/libraries/ArduinoOTA
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include "SoftwareSerial.h"
#include <TinyGPSPlus.h>
#include <ArduinoJson.h>
bool connected_wifi = 0;

#define run_every(t) for (static uint16_t last_; \


(uint16_t)(uint16_t(millis()) - last_) >= (t); \
last_ += (t))
#define csn 15
#define mosi 13 //hspi
#define miso 12
#define clk 14
#define ce 2
unsigned long time_mm = millis();
float last_value_1, last_value_2;
float giatri[5]; // gia tri cua cam bien
float slave1[5];
float slave2[5];
uint8_t state_led = 0;
bool gps_status = 0;
RF24 radio(2, 15, clk, miso, mosi); // CE, CSN
const uint64_t address = 0xF0F0F0F0E1LL;
const char* ssid = "Redmi Note 11"; //replace with your SSID
const char* password = "12345678"; //replace with your password
TinyGPSPlus gps; // create gps object
SoftwareSerial sim_(22, 23); // rx tx
WebServer server(80);
String apn = "v-connect"; //APN
String apn_u = ""; //APN-Username
String apn_p = ""; //APN-Password
String url_post = "http://scube.loca.lt/box/upload-data/mother01"; //URL of Server
String url_get = "api.thingspeak.com/channels/119922/feeds/last.txt";
String data_get = "";
String timestamp;
float lat_value = 0; //21.0037091
float lng_value = 0; //105.8431574
float temp, hum, acc;
const char* host = "esp32";
const char* loginIndex =
"<form name='loginForm'>"
"<table width='20%' bgcolor='A09F9F' align='center'>"
"<tr>"
"<td colspan=2>"
"<center><font size=4><b>ESP32 Login Page</b></font></center>"
"<br>"
"</td>"
"<br>"
"<br>"
"</tr>"
"<td>Username:</td>"
"<td><input type='text' size=25 name='userid'><br></td>"
"</tr>"
"<br>"
"<br>"
"<tr>"
"<td>Password:</td>"
"<td><input type='Password' size=25 name='pwd'><br></td>"
"<br>"
"<br>"
"</tr>"
"<tr>"
"<td><input type='submit' onclick='check(this.form)' value='Login'></td>"
"</tr>"
"</table>"
"</form>"
"<script>"
"function check(form)"
"{"
"if(form.userid.value=='admin' && form.pwd.value=='admin')"
"{"
"window.open('/serverIndex')"
"}"
"else"
"{"
" alert('Error Password or Username')/*displays error message*/"
"}"
"}"
"</script>";

/*
* Server Index Page
*/

const char* serverIndex =


"<script
src='https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js'></script>"
"<form method='POST' action='#' enctype='multipart/form-data' id='upload_form'>"
"<input type='file' name='update'>"
"<input type='submit' value='Update'>"
"</form>"
"<div id='prg'>progress: 0%</div>"
"<script>"
"$('form').submit(function(e){"
"e.preventDefault();"
"var form = $('#upload_form')[0];"
"var data = new FormData(form);"
" $.ajax({"
"url: '/update',"
"type: 'POST',"
"data: data,"
"contentType: false,"
"processData:false,"
"xhr: function() {"
"var xhr = new window.XMLHttpRequest();"
"xhr.upload.addEventListener('progress', function(evt) {"
"if (evt.lengthComputable) {"
"var per = evt.loaded / evt.total;"
"$('#prg').html('progress: ' + Math.round(per*100) + '%');"
"}"
"}, false);"
"return xhr;"
"},"
"success:function(d, s) {"
"console.log('success!')"
"},"
"error: function (a, b, c) {"
"}"
"});"
"});"
"</script>";

/*
* setup function
*/
void gsm_send_serial(String command, uint32_t time_delay = 3000, bool cvt_data = 0)
{
Serial.println("Send ->: " + command);
sim_.println(command);
long wtimer = millis();
while (wtimer + time_delay > millis()) {
if (connected_wifi == 1) server.handleClient();
while (sim_.available()) {
char c = sim_.read();
Serial.write(c);
}
}
Serial.println();
}
void gsm_config_gprs() {
Serial.println(" --- CONFIG GPRS --- ");
gsm_send_serial("AT+SAPBR=3,1,Contype,GPRS");
gsm_send_serial("AT+SAPBR=3,1,APN," + apn);
if (apn_u != "") {
gsm_send_serial("AT+SAPBR=3,1,USER," + apn_u);
}
if (apn_p != "") {
gsm_send_serial("AT+SAPBR=3,1,PWD," + apn_p);
}
}
String str_cvt(String str) {
String c = "\"" + str + "\"";
return c;
}
void gsm_http_post(String postdata) {
Serial.println(" --- Start GPRS & HTTP --- ");
// gsm_send_serial("AT+SAPBR=1,1");
// // gsm_send_serial("AT+SAPBR=2,1");
// gsm_send_serial("AT+HTTPINIT");
gsm_send_serial("AT+HTTPPARA=\"CID\",1");
StaticJsonDocument<400> doc;
doc["timeStamp"] = "1672483819";
doc["longitude"] = lng_value;
doc["latitude"] = lat_value;
JsonArray slave = doc.createNestedArray("slaves");
StaticJsonDocument<200> slaves;
slaves["id"] = "box01";
slaves["temperature"] = slave1[2];
slaves["humidity"] = slave1[1];
slaves["acceleration"] = slave1[0];
StaticJsonDocument<200> slaves2;
slaves2["id"] = "box02";
slaves2["temperature"] = slave2[2];
slaves2["humidity"] = slave2[1];

slaves2["acceleration"] = slave2[0];

//StaticJsonDocument<200> slaves3;
// slaves3["id"] = "sla";
// slaves3["temperature"] = temp;
// slaves3["humidity"] = hum;
// slaves3["acceleration"] = acc;
slave.add(slaves);
slave.add(slaves2);
// slave.add(slaves3);
String c;
serializeJson(doc, c);
gsm_send_serial("AT+HTTPPARA=\"URL\",\"http://scube.loca.lt/box/upload-data/
mother01\"", 4000);
gsm_send_serial("AT+HTTPPARA=\"CONTENT\",\"application/json\""); /// thay bang
json
gsm_send_serial("AT+HTTPDATA=" + String(c.length()) + ",10000");
gsm_send_serial(c);
gsm_send_serial("AT+HTTPACTION=1", 10000);
gsm_send_serial("AT+HTTPREAD", 4000);
//gsm_send_serial("AT+HTTPTERM",10000);
// gsm_send_serial("AT+SAPBR=0,1");
time_mm = millis();
}
void gsm_http_get() {
gsm_send_serial("AT+SAPBR=1,1");
gsm_send_serial("AT+SAPBR=2,1");
gsm_send_serial("AT+HTTPINIT");
gsm_send_serial("AT+HTTPPARA=CID,1");
gsm_send_serial("AT+HTTPPARA=URL," + url_get);
gsm_send_serial("AT+HTTPACTION=0");
gsm_send_serial("AT+HTTPREAD", 5000, 1);
}
bool connected_ = 0;

void setup() {
Serial.begin(9600);
sim_.begin(9600);
Serial2.begin(9600); // gps
Serial.println("Booting");
pinMode(33, OUTPUT);
pinMode(25, OUTPUT);
digitalWrite(25, HIGH);
digitalWrite(33, LOW);

WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
static uint16_t count_delay = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(500);
count_delay++;
if (count_delay >= 30) {
SPI.begin(14, 12, 13, 15);
radio.begin();
radio.openReadingPipe(0, address); //Setting the address at which we will
receive the data
radio.setPALevel(RF24_PA_MIN); //You can set this as minimum or maximum
depending on the distance between the transmitter and receiver.
radio.startListening();
for (int i = 0; i < 10; i++) {
digitalWrite(25, LOW);
delay(200);
digitalWrite(25, HIGH);
delay(200);
}
sim_.setTimeout(100);
return;
}
Serial.print(".");
}
connected_wifi = 1;
Serial.println("");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
delay(3000);
// Port defaults to 8266
// ArduinoOTA.setPort(8266);
if (!MDNS.begin(host)) { //http://esp32.local
Serial.println("Error setting up MDNS responder!");
while (1) {
delay(1000);
}
}
Serial.println("mDNS responder started");
/*return index page which is stored in serverIndex */
server.on("/", HTTP_GET, []() {
server.sendHeader("Connection", "close");
server.send(200, "text/html", loginIndex);
});
server.on("/serverIndex", HTTP_GET, []() {
server.sendHeader("Connection", "close");
server.send(200, "text/html", serverIndex);
});
/*handling uploading firmware file */
server.on(
"/update", HTTP_POST, []() {
server.sendHeader("Connection", "close");
server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
ESP.restart();
},
[]() {
HTTPUpload& upload = server.upload();
if (upload.status == UPLOAD_FILE_START) {
Serial.printf("Update: %s\n", upload.filename.c_str());
if (!Update.begin(UPDATE_SIZE_UNKNOWN)) { //start with max available size
Update.printError(Serial);
}
} else if (upload.status == UPLOAD_FILE_WRITE) {
/* flashing firmware to ESP*/
if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
Update.printError(Serial);
}
} else if (upload.status == UPLOAD_FILE_END) {
if (Update.end(true)) { //true to set the size to the current progress
Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);
} else {
Update.printError(Serial);
}
}
});

server.begin();
SPI.begin(14, 12, 13, 15);
radio.begin();
radio.openReadingPipe(0, address); //Setting the address at which we will
receive the data
radio.setPALevel(RF24_PA_MIN); //You can set this as minimum or maximum
depending on the distance between the transmitter and receiver.
radio.startListening();
sim_.setTimeout(100);
}
int recvData() {
if (radio.available()) {
radio.read(&giatri, sizeof(giatri));
if ((int)giatri[4] == 6) {
for (int i = 0; i < 5; i++) {
if (giatri[i] == NAN) slave2[i] = 0;
else slave2[i] = giatri[i];
}
} else {
for (int i = 0; i < 5; i++) {
if (giatri[i] == NAN) slave1[i] = 0;
else slave1[i] = giatri[i];
}
}
static uint8_t count_1 = 0;
static uint8_t count_2 = 0;
/*
if (abs(last_value_1 - slave1[4]) ==0) {
count_1++;
if (count_1 >= 2) {
count_1 = 0;
for (int i = 0; i < 5; i++) {
slave1[i] = 0;
}
}
}
if(abs(last_value_2-slave2[0])==0)
{
count_2++;
if(count_2>=2)
{
count_2=0;
for(int i =0 ; i<5;i++)
{
slave2[i]=0;
}
}
}
last_value_1 = slave1[4];
last_value_2 = slave2[0];
*/
return 1;
}
return 0;
}
void loop() {
static bool connected_2 = 0;
static bool send_sms = 0;
if (connected_wifi == 1) server.handleClient();
if (connected_ == 0 && connected_2 == 0) {
static uint8_t count_signal = 0;
static unsigned long time_d = millis();
if (millis() - time_d > 1000) {
/// Serial.println("send");
sim_.println("AT+CSQ");
time_d = millis();
}
if (sim_.available()) {
String c = sim_.readString();
Serial.println(c);
int m = c.indexOf(":");
if (m != -1) {
// int u = c.indexOf(",");
//Serial.println("m:"+String(m));
//Serial.println(c.substring(m+1,m+3));
int x = c.substring(m + 1, m + 4).toInt();
if (x >= 8) {
count_signal++;
}
if (count_signal >= 5) {
connected_2 = 1;
connected_ = 0;
gsm_config_gprs();
gsm_send_serial("AT+SAPBR=1,1");
}
Serial.println("x:" + String(x));
}
}
}
if (connected_2 == 1) {
static unsigned long time_d2 = millis();
if (millis() - time_d2 > 1000) {
/// Serial.println("send");
sim_.println("AT+SAPBR=2,1");
time_d2 = millis();
}
if (sim_.available()) {
String c = sim_.readString();
Serial.println(c);
int m = c.indexOf(".");
if (m != -1) {
String str_2 = c.substring(m + 1);
int ind_2 = str_2.indexOf(".");
Serial.println("str:" + str_2);

//Serial.println("m:"+String(m));
//Serial.println(c.substring(m+1,m+3));
Serial.println(str_2.substring(0, ind_2));
int x = str_2.substring(0, ind_2).toInt();

if (x != 0) {
connected_2 = 0;
digitalWrite(25, LOW);
// digitalWrite(33, HIGH);
connected_ = 1;
}
Serial.println("x:" + String(x));
}
}
}
static uint8_t count_ti = 0;
run_every(500) {
count_ti++;
send_sms = recvData();
if (send_sms) {
Serial.print("slave1:");
for (int i = 0; i < 3; i++) {
Serial.print(slave1[i]);
Serial.print(",");
}
Serial.println();
Serial.print("slave2:");
for (int i = 0; i < 3; i++) {
Serial.print(slave2[i]);
Serial.print(",");
}
Serial.println();
}
}
if (connected_ == 1) {
static unsigned long time_m = millis();
if (Serial2.available() > 0) {
//Serial.println("serial2:"+String(Serial2.read()));
gps.encode(Serial2.read());
if (gps_status == 0) {
if (gps.location.isValid()) {
lat_value = gps.location.lat();
lng_value = gps.location.lng();
// Serial.println(lat_value);
gps_status = 1;
} else {
Serial.print(F("INVALID"));
}
// Serial.println(lng_value);

} else {
if (gps.location.isValid()) {
lat_value = gps.location.lat();
lng_value = gps.location.lng();
// Serial.println(lat_value);
}
}
}
if (millis() - time_m > 500) {
time_m = millis();
if (gps_status == 0) {
digitalWrite(33, state_led);
state_led = 1 - state_led;
//Serial.println(state_led);
return;
} else {
digitalWrite(33, HIGH);
}
}
for (int i = 0; i < 5; i++) {
if (giatri[i] == 0) return;
}
if (lat_value == 0 && lng_value == 0) {
gps_status = 0;
time_mm = millis();
return;
}
digitalWrite(33, HIGH);

static bool first_time = 0;


if (millis() - time_mm > 1000) {

if (first_time == 0) {
first_time = 1;
gsm_send_serial("AT+SAPBR=1,1");
// gsm_send_serial("AT+SAPBR=2,1");
gsm_send_serial("AT+HTTPINIT");
}
Serial.println("send");
time_mm = millis();
if (send_sms && count_ti >= 2) {
gsm_http_post(" ");
count_ti = 0;
send_sms=0;
}
}
}
//any custom code or logic goes here
}

You might also like