Advertisement
tbatista

Webserver_DHT_NTP_Ajax

Apr 26th, 2017
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.60 KB | None | 0 0
  1. #include <ESP8266WiFi.h>
  2. #include <ESP8266WebServer.h>
  3.  
  4. //*********************SERVER***********************
  5. ESP8266WebServer server(80);
  6. const char* ssid = "MinhaRede";
  7. const char* password = "MinhaSenha";
  8. //*********************server***********************
  9.  
  10. //******************** NTP *******************//
  11. #include <TimeLib.h>      //https://github.com/PaulStoffregen/Time
  12. #include <WiFiUdp.h>
  13. static const char ntpServerName[] = "a.ntp.br"; //Servidor (pode ser a.ntp.br / b.ntp.br / c.ntp.br )
  14. const int timeZone = -4; // Fuso horario (-3 Padrão / -2 Horário de Verão)
  15.  
  16. WiFiUDP Udp;
  17. unsigned int localPort = 8888;
  18. time_t getNtpTime();
  19. void sendNTPpacket(IPAddress &address);
  20. const int NTP_PACKET_SIZE = 48;
  21. byte packetBuffer[NTP_PACKET_SIZE];
  22.  
  23. time_t getNtpTime()
  24. {
  25.   IPAddress ntpServerIP;
  26.   while (Udp.parsePacket() > 0) ;
  27.   Serial.println(F("*WifiRTC: Transmitindo NTP Request"));
  28.   WiFi.hostByName(ntpServerName, ntpServerIP);
  29.   Serial.print(ntpServerName);
  30.   Serial.print(": ");
  31.   Serial.println(ntpServerIP);
  32.   sendNTPpacket(ntpServerIP);
  33.   uint32_t beginWait = millis();
  34.   while (millis() - beginWait < 3000) {
  35.     int size = Udp.parsePacket();
  36.     if (size >= NTP_PACKET_SIZE) {
  37.       Serial.println(F("*WifiRTC: Resposta recebida do NTP"));
  38.       Udp.read(packetBuffer, NTP_PACKET_SIZE);
  39.       unsigned long secsSince1900;
  40.       secsSince1900 =  (unsigned long)packetBuffer[40] << 24;
  41.       secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
  42.       secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
  43.       secsSince1900 |= (unsigned long)packetBuffer[43];
  44.       return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
  45.     }
  46.   }
  47.   Serial.println("*WifiRTC: Sem resposta do NTP");
  48.   return 0;
  49. }
  50.  
  51. void sendNTPpacket(IPAddress &address)
  52. {
  53.   memset(packetBuffer, 0, NTP_PACKET_SIZE);
  54.   packetBuffer[0] = 0b11100011;
  55.   packetBuffer[1] = 0;
  56.   packetBuffer[2] = 6;
  57.   packetBuffer[3] = 0xEC;
  58.   packetBuffer[12] = 49;
  59.   packetBuffer[13] = 0x4E;
  60.   packetBuffer[14] = 49;
  61.   packetBuffer[15] = 52;
  62.   Udp.beginPacket(address, 123);
  63.   Udp.write(packetBuffer, NTP_PACKET_SIZE);
  64.   Udp.endPacket();
  65. }
  66. time_t prevDisplay = 0;
  67.  
  68. //******************** Verificação das horas *******************//
  69.  
  70. String gethora () {//faz a leitura do RTC DS3231
  71.   char hora[30];
  72.   Serial.println("*WifiRTC: Checking all hours");
  73.   sprintf( hora, "%02d:%02d:%02d", hour(), minute(), second());
  74.   //Serial.println (hora);
  75.   return hora;
  76. }
  77.  
  78. //**********************DHT*************************
  79. #include <DHT.h>// https://github.com/adafruit/DHT-sensor-library
  80. #define DHTTYPE DHT11// usei o DHT11, recomendo o DHT22
  81. #define DHTPIN  D4
  82.  
  83. DHT dht(DHTPIN, DHTTYPE, 11); // 11 works fine for ESP8266
  84.  
  85. unsigned long previousMillis = 0;        // will store last temp was read
  86. const long interval = 120000;            // 2 min interval at which to read sensor
  87.  
  88. int humidity;
  89. int gethumidity() {
  90.   // Values read from sensor
  91.  
  92.     humidity = dht.readHumidity();          // Read humidity (percent)
  93.     if ((isnan(humidity))||(humidity == 2147483647)) {
  94.       Serial.println("Failed read DHT sensor!");
  95.       humidity = 0;
  96.     }
  97.       return humidity;
  98.   }
  99.  
  100.  
  101. int gettemperature() {
  102.   int temp_C;  // Values read from sensor
  103.   temp_C = (dht.readTemperature() - 1); //-1ºC correçao da temp do ESP que aquece o sensor  // Read temperature as Celcius
  104.   // Check if any reads failed and exit early (to try again).
  105.   if ((isnan(temp_C))||(temp_C == 2147483647)) {
  106.     Serial.println("Failed read DHT sensor!");
  107.      temp_C = 0;
  108.   }
  109.   return temp_C;
  110. }
  111. //**********************dht*************************
  112.  
  113. String webSite, javaScript, XML, XMLFromSerial;
  114.  
  115. //*******************Ajax*******************
  116. void buildXML() {
  117.  
  118.   int humidity = gethumidity();
  119.   int temp_C = gettemperature();
  120.  
  121.   XML = "<?xml version='1.0'?>";
  122.   XML += "<xml>";
  123.  
  124.   XML += "<hora>";
  125.   XML += gethora ();
  126.   XML += "</hora>";
  127.  
  128.   XML += "<humidity>";
  129.   XML += String(humidity);
  130.   XML += "</humidity>";
  131.  
  132.   XML += "<temp>";
  133.   XML += String(temp_C);
  134.   XML += "</temp>";
  135.  
  136.   XML += "</xml>";
  137. }
  138.  
  139. void buildJavascript() {
  140.   javaScript = "<SCRIPT>\n";
  141.   javaScript += "xmlHttp=createXmlHttpObject();\n";
  142.  
  143.   javaScript += "function createXmlHttpObject(){\n";
  144.   javaScript += "  if(window.XMLHttpRequest){\n";
  145.   javaScript += "    xmlHttp=new XMLHttpRequest();\n";
  146.   javaScript += "  }else{\n";
  147.   javaScript += "    xmlHttp=new ActiveXObject('Microsoft.XMLHTTP');\n";
  148.   javaScript += "  }\n";
  149.   javaScript += "  return xmlHttp;\n";
  150.   javaScript += "}\n";
  151.  
  152.   javaScript += "function process(){\n";
  153.   javaScript += "  if(xmlHttp.readyState==0||xmlHttp.readyState==4){\n";
  154.   javaScript += "    xmlHttp.onreadystatechange=function(){\n";
  155.   javaScript += "      if(xmlHttp.readyState==4&&xmlHttp.status==200){\n";
  156.   javaScript += "        xmlDoc=xmlHttp.responseXML;\n";
  157.  
  158.   javaScript += "        xmlmsg=xmlDoc.getElementsByTagName('humidity')[0].firstChild.nodeValue;\n"; //le a tag  em  buildXML()
  159.   javaScript += "        document.getElementById('labelhumidity').innerHTML=xmlmsg;\n"; // retorna o valor em builwebsite()
  160.  
  161.   javaScript += "        xmlmsg=xmlDoc.getElementsByTagName('temp')[0].firstChild.nodeValue;\n";//le a tag  em  buildXML()
  162.   javaScript += "        document.getElementById('labeltemp').innerHTML=xmlmsg;\n";
  163.  
  164.   javaScript += "        xmlmsg=xmlDoc.getElementsByTagName('hora')[0].firstChild.nodeValue;\n";le a tag  em  buildXML()
  165.   javaScript += "        document.getElementById('labelhora').innerHTML=xmlmsg;\n";retorna o valor em builwebsite()
  166.  
  167.   javaScript += "      }\n";
  168.   javaScript += "    }\n";
  169.   javaScript += "    xmlHttp.open('PUT','xml',true);\n";
  170.   javaScript += "    xmlHttp.send(null);\n";
  171.   javaScript += "  }\n";
  172.   javaScript += "  setTimeout('process()',1000);\n";
  173.   javaScript += "}\n";
  174.  
  175.  
  176.   javaScript += "</SCRIPT>\n";
  177. }
  178. //**********************ajax*************************
  179.  
  180. //*********************WEBSITE***********************
  181. char headerHTML[] =  "<!DOCTYPE HTML>\r\n" // monta o cabeçalho da pagina
  182.                      "<html lang=\"en\">"
  183.                      "<head>"
  184.                      "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\"/>\r\n"
  185.                      "<link href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css' rel='stylesheet'></link>"
  186.                      "<link rel=\"stylesheet\" href=\"http://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.6.3/css/font-awesome.min.css\">"
  187.                      "<script src='https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js'></script>"
  188.                      "<title>Webserver ESP8266</title>"
  189.                      "<style>.c{text-align: center;} div,input{padding:5px;font-size:1em;} input{width:80%;} body{text-align: center;font-family:verdana;}</style>"
  190.                      "<div class=\"panel panel-primary\">"//abre painel
  191.                      "<div class=\"panel-heading\"><h3>ESP8266 WebServer</h3></div>"
  192.                      "<div class=\"panel-body\">"
  193.                      "</div>"//fecha painel
  194.                      "<div id=\"txt\" style=\"font-weight:bold;\"></div>"
  195.                      "</head>" ;
  196.  
  197. char footerHTML[] = "</div></body></html>";//monta rodapé da pagina
  198.  
  199.  
  200. void buildWebsite() {// monta a pagina html
  201.   buildJavascript();// recupera o valor das tags
  202.   webSite += String (headerHTML);// monta o cabeçalho
  203.   webSite += javaScript;
  204.   webSite += "<BODY onload='process()'>\n";
  205.  
  206.   webSite += "<h3><center><strong><A ID='labelhora'></A></strong></center></h3>";// recupera a hora em Ajax
  207. //conteiner humidade e temperatura
  208.   webSite += (F("<div class = 'container'>"));//<style>.c{text-align: center;}</style>// abre conteiner
  209.   webSite += (F("<div class = 'well'>"));// abre Well
  210.   webSite += "<h1><strong>\n";// humidade
  211.   webSite += "H = <A ID='labelhumidity'> </A>\n";// recupera a label humidade em Ajax
  212.   webSite += (F(" %</strong></h1>"));;// humidade
  213.   webSite += "<h1><strong>\n";//temp
  214.   webSite += "T= <A ID='labeltemp'></A> &#176C<BR>\n";// recupera a label temperatura
  215.   webSite += (F("</strong></h1>"));//temp
  216.   webSite += (F("</div>"));//fecha well
  217.   webSite += (F("</div>"));// fecha conteiner
  218. //conteiner
  219.   webSite += (F("</BODY>"));
  220.  
  221.   webSite += String (footerHTML);//monta o rodapé
  222.  
  223. }
  224.  
  225. void handleWebsite() {// carrega a pagina no server on
  226.   buildWebsite();
  227.   server.send(200, "text/html", webSite);
  228. }
  229.  
  230. void handleXML() { // recupera o XML
  231.   buildXML();
  232.   server.send(200, "text/xml", XML);
  233. }
  234.  
  235. //*********************website***********************
  236.  
  237. void setup() {
  238.   Serial.begin(115200);
  239.   WiFi.begin(ssid, password);
  240.   while (WiFi.status() != WL_CONNECTED)delay(500);
  241.   WiFi.mode(WIFI_STA);
  242.   Serial.println("\n\nBOOTING ESP8266 ...");
  243.   Serial.print("Connected to ");
  244.   Serial.println(ssid);
  245.   Serial.print("Station IP address: ");
  246.   Serial.println(WiFi.localIP());
  247.  
  248.   //*********************SERVER***********************
  249.   server.on("/", handleWebsite);// carrega a pagina
  250.   server.on("/xml", handleXML);// carrega o XML
  251.   server.begin();
  252.   //*********************server***********************
  253.  
  254.   //**********************NTP*******************
  255.   Serial.println(F("*WifiRTC: Iniciando UDP"));
  256.   Udp.begin(localPort);
  257.   Serial.print(F("*WifiRTC: Porta local: "));
  258.   Serial.println(Udp.localPort());
  259.   Serial.println(F("*WifiRTC: Aguardando sincronia com o servidor NTP"));
  260.   setSyncProvider(getNtpTime);
  261.   setSyncInterval(300);     // Intervalo de sincronia com servidor (Padrão: 300)(segundos)
  262.   //**********************ntp*********************
  263. }
  264.  
  265. void loop() {
  266.  
  267.   server.handleClient();
  268.  
  269. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement