2021年12月3日 星期五

ESP32 DS18B20 Temperature Sensor

ESP32 DS18B20 Temperature Sensor

源自於https://randomnerdtutorials.com/esp32-ds18b20-temperature-arduino-ide/ 




















/*********

  Rui Santos

  Complete project details at https://RandomNerdTutorials.com  

*********/


// Import required libraries

#ifdef ESP32

  #include <WiFi.h>

  #include <ESPAsyncWebServer.h>

#else

  #include <Arduino.h>

  #include <ESP8266WiFi.h>

  #include <Hash.h>

  #include <ESPAsyncTCP.h>

  #include <ESPAsyncWebServer.h>S

#endif

#include <OneWire.h>

#include <DallasTemperature.h>


// Data wire is connected to GPIO 4

#define ONE_WIRE_BUS 4


// Setup a oneWire instance to communicate with any OneWire devices

OneWire oneWire(ONE_WIRE_BUS);


// Pass our oneWire reference to Dallas Temperature sensor 

DallasTemperature sensors(&oneWire);


// Variables to store temperature values

String temperatureF = "";

String temperatureC = "";


// Timer variables

unsigned long lastTime = 0;  

unsigned long timerDelay = 30000;


// Replace with your network credentials

//const char* ssid = "REPLACE_WITH_YOUR_SSID";

//const char* password = "REPLACE_WITH_YOUR_PASSWORD";

const char* ssid     = "PTS-2F";

const char* password = "PTS6662594";


// Create AsyncWebServer object on port 80

AsyncWebServer server(80);


String readDSTemperatureC() {

  // Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus

  sensors.requestTemperatures(); 

  float tempC = sensors.getTempCByIndex(0);


  if(tempC == -127.00) {

    Serial.println("Failed to read from DS18B20 sensor");

    return "--";

  } else {

    Serial.print("Temperature Celsius: ");

    Serial.println(tempC); 

  }

  return String(tempC);

}


String readDSTemperatureF() {

  // Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus

  sensors.requestTemperatures(); 

  float tempF = sensors.getTempFByIndex(0);


  if(int(tempF) == -196){

    Serial.println("Failed to read from DS18B20 sensor");

    return "--";

  } else {

    Serial.print("Temperature Fahrenheit: ");

    Serial.println(tempF);

  }

  return String(tempF);

}


const char index_html[] PROGMEM = R"rawliteral(

<!DOCTYPE HTML><html>

<head>

  <meta name="viewport" content="width=device-width, initial-scale=1">

  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">

  <style>

    html {

     font-family: Arial;

     display: inline-block;

     margin: 0px auto;

     text-align: center;

    }

    h2 { font-size: 3.0rem; }

    p { font-size: 3.0rem; }

    .units { font-size: 1.2rem; }

    .ds-labels{

      font-size: 1.5rem;

      vertical-align:middle;

      padding-bottom: 15px;

    }

  </style>

</head>

<body>

  <meta charset="utf-8">

  <h2>ESP DS18B20 Server</h2>

  <p>

    <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 

    <span class="ds-labels">Temperature Celsius  攝氏溫度</span> 

    <span id="temperaturec">%TEMPERATUREC%</span>

    <sup class="units">&deg;C</sup>

  </p>

  <p>

    <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 

    <span class="ds-labels">Temperature Fahrenheit  華氏溫度</span>

    <span id="temperaturef">%TEMPERATUREF%</span>

    <sup class="units">&deg;F</sup>

  </p>

</body>

<script>

setInterval(function ( ) {

  var xhttp = new XMLHttpRequest();

  xhttp.onreadystatechange = function() {

    if (this.readyState == 4 && this.status == 200) {

      document.getElementById("temperaturec").innerHTML = this.responseText;

    }

  };

  xhttp.open("GET", "/temperaturec", true);

  xhttp.send();

}, 10000) ;

setInterval(function ( ) {

  var xhttp = new XMLHttpRequest();

  xhttp.onreadystatechange = function() {

    if (this.readyState == 4 && this.status == 200) {

      document.getElementById("temperaturef").innerHTML = this.responseText;

    }

  };

  xhttp.open("GET", "/temperaturef", true);

  xhttp.send();

}, 10000) ;

</script>

</html>)rawliteral";


// Replaces placeholder with DS18B20 values

String processor(const String& var){

  //Serial.println(var);

  if(var == "TEMPERATUREC"){

    return temperatureC;

  }

  else if(var == "TEMPERATUREF"){

    return temperatureF;

  }

  return String();

}


void setup(){

  // Serial port for debugging purposes

  Serial.begin(115200);

  Serial.println();

  

  // Start up the DS18B20 library

  sensors.begin();


  temperatureC = readDSTemperatureC();

  temperatureF = readDSTemperatureF();


  // Connect to Wi-Fi

  WiFi.begin(ssid, password);

  Serial.println("Connecting to WiFi");

  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(".");

  }

  Serial.println();

  

  // Print ESP Local IP Address

  Serial.println(WiFi.localIP());


  // Route for root / web page

  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){

    request->send_P(200, "text/html", index_html, processor);

  });

  server.on("/temperaturec", HTTP_GET, [](AsyncWebServerRequest *request){

    request->send_P(200, "text/plain", temperatureC.c_str());

  });

  server.on("/temperaturef", HTTP_GET, [](AsyncWebServerRequest *request){

    request->send_P(200, "text/plain", temperatureF.c_str());

  });

  // Start server

  server.begin();

}

 

void loop(){

  if ((millis() - lastTime) > timerDelay) {

    temperatureC = readDSTemperatureC();

    temperatureF = readDSTemperatureF();

    lastTime = millis();

  }  

}



沒有留言:

張貼留言

Messaging API作為替代方案

  LINE超好用功能要沒了!LINE Notify明年3月底終止服務,有什麼替代方案? LINE Notify將於2025年3月31日結束服務,官方建議改用Messaging API作為替代方案。 //CHANNEL_ACCESS_TOKEN = 'Messaging ...