Advertisement
Guest User

Untitled

a guest
Apr 29th, 2018
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.95 KB | None | 0 0
  1. #include <OneWire.h>
  2. #include <ESP8266WiFi.h>
  3.  
  4. const char* ssid = "sadhu-home";
  5. const char* password = "dir3002003";
  6.  
  7. // Create an instance of the server
  8. // specify the port to listen on as an argument
  9. WiFiServer server(80);
  10.  
  11. // пример использования библиотеки OneWire DS18S20, DS18B20, DS1822
  12. OneWire ds(2); // на пине 10 (нужен резистор 4.7 КОм)
  13.  
  14. void setup(void) {
  15.  
  16.     Serial.begin(9600);
  17.     delay(10);
  18.     // Connect to WiFi network
  19.     Serial.println();
  20.     Serial.println();
  21.     Serial.print("Connecting to ");
  22.     Serial.println(ssid);
  23.  
  24.     WiFi.mode(WIFI_STA);
  25.     WiFi.begin(ssid, password);
  26.  
  27.     while (WiFi.status() != WL_CONNECTED) {
  28.         delay(500);
  29.         Serial.print(".");
  30.     }
  31.     Serial.println("");
  32.     Serial.println("WiFi connected");
  33.  
  34.     // Start the server
  35.     server.begin();
  36.     Serial.println("Server started");
  37.  
  38.     // Print the IP address
  39.     Serial.println(WiFi.localIP());
  40.  
  41. }
  42.  
  43. const char* thermo_id(char code, byte& type_s) {
  44.     switch (code) {
  45.         case 0x10:
  46.             type_s = 1;
  47.             return " Chip = DS18S20"; // или более старый DS1820
  48.         case 0x28:
  49.             type_s = 0;
  50.             return " Chip = DS18B20"; // или более старый DS1820
  51.         case 0x22:
  52.             type_s = 0;
  53.             return " Chip = DS1822"; // или более старый DS1820
  54.         default:
  55.             type_s = 2;
  56.             return "Device is not a DS18x20 family device.";
  57.     }
  58. }
  59.  
  60. bool thermo_probe(float& probe) {
  61.     byte i;
  62.  
  63.     byte present = 0;
  64.  
  65.     byte type_s;
  66.  
  67.     byte data[12];
  68.  
  69.     byte addr[8];
  70.  
  71.     float celsius, fahrenheit;
  72.  
  73.     if ( !ds.search(addr)) {
  74.  
  75.         Serial.println("No more addresses.");
  76.  
  77.         Serial.println();
  78.  
  79.         ds.reset_search();
  80.  
  81.         delay(250);
  82.  
  83.         return false;
  84.  
  85.     }
  86.  
  87.     Serial.print("ROM =");
  88.  
  89.     for( i = 0; i < 8; i++) {
  90.  
  91.         Serial.write(' ');
  92.  
  93.         Serial.print(addr[i], HEX);
  94.  
  95.     }
  96.  
  97.     if (OneWire::crc8(addr, 7) != addr[7]) {
  98.  
  99.         Serial.println("CRC is not valid!");
  100.  
  101.         return false;
  102.  
  103.     }
  104.  
  105.     Serial.println();
  106.  
  107.     // первый байт определяет чип
  108.     Serial.println(thermo_id(addr[0], type_s));
  109.     if (type_s > 1) return false;
  110.  
  111.  
  112.     ds.reset();
  113.  
  114.     ds.select(addr);
  115.  
  116.     ds.write(0x44); // начинаем преобразование, используя ds.write(0x44,1) с "паразитным" питанием
  117.  
  118.     delay(1000); // 750 может быть достаточно, а может быть и не хватит
  119.  
  120.     // мы могли бы использовать тут ds.depower(), но reset позаботится об этом
  121.  
  122.     present = ds.reset();
  123.  
  124.     ds.select(addr);
  125.  
  126.     ds.write(0xBE);
  127.  
  128.     Serial.print(" Data = ");
  129.  
  130.     Serial.print(present, HEX);
  131.  
  132.     Serial.print(" ");
  133.  
  134.     for ( i = 0; i < 9; i++) { // нам необходимо 9 байт
  135.  
  136.         data[i] = ds.read();
  137.  
  138.         Serial.print(data[i], HEX);
  139.  
  140.         Serial.print(" ");
  141.  
  142.     }
  143.  
  144.     Serial.print(" CRC=");
  145.  
  146.     Serial.print(OneWire::crc8(data, 8), HEX);
  147.  
  148.     Serial.println();
  149.  
  150.     // конвертируем данный в фактическую температуру
  151.  
  152.     // так как результат является 16 битным целым, его надо хранить в
  153.  
  154.     // переменной с типом данных "int16_t", которая всегда равна 16 битам,
  155.  
  156.     // даже если мы проводим компиляцию на 32-х битном процессоре
  157.  
  158.     int16_t raw = (data[1] << 8) | data[0];
  159.  
  160.     if (type_s) {
  161.  
  162.         raw = raw << 3; // разрешение 9 бит по умолчанию
  163.  
  164.         if (data[7] == 0x10) {
  165.  
  166.             raw = (raw & 0xFFF0) + 12 - data[6];
  167.  
  168.         }
  169.  
  170.     } else {
  171.  
  172.         byte cfg = (data[4] & 0x60);
  173.  
  174.         // при маленьких значениях, малые биты не определены, давайте их обнулим
  175.  
  176.         if (cfg == 0x00) raw = raw & ~7; // разрешение 9 бит, 93.75 мс
  177.  
  178.         else if (cfg == 0x20) raw = raw & ~3; // разрешение 10 бит, 187.5 мс
  179.  
  180.         else if (cfg == 0x40) raw = raw & ~1; // разрешение 11 бит, 375 мс
  181.  
  182.         //// разрешение по умолчанию равно 12 бит, время преобразования - 750 мс
  183.  
  184.     }
  185.  
  186.     celsius = (float)raw / 16.0;
  187.  
  188.     fahrenheit = celsius * 1.8 + 32.0;
  189.  
  190.     Serial.print(" Temperature = ");
  191.  
  192.     Serial.print(celsius);
  193.  
  194.     Serial.print(" Celsius, ");
  195.  
  196.     Serial.print(fahrenheit);
  197.  
  198.     Serial.println(" Fahrenheit");
  199.     probe = celsius;
  200.     return true;
  201. }
  202.  
  203. void loop(void) {
  204.     // Check if a client has connected
  205.     WiFiClient client = server.available();
  206.     if (!client) {
  207.         return;
  208.     }
  209.  
  210.     // Wait until the client sends some data
  211.     Serial.println("new client");
  212.     while(!client.available()){
  213.         delay(1);
  214.     }
  215.  
  216.     // Read the first line of the request
  217.     String req = client.readStringUntil('\r');
  218.     Serial.println(req);
  219.     client.flush();
  220.  
  221.     client.flush();
  222.  
  223. //    String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n";
  224.     String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
  225.     float celsius;
  226.     byte retry_count = 5;
  227.    
  228.     while(!thermo_probe(celsius) && retry_count > 0) {
  229.         retry_count--;
  230.     }
  231.    
  232.     if (retry_count > 0) {
  233.         s += String(celsius);
  234.     } else {
  235.         s += "No data";
  236.     }  
  237.  
  238.     s += "\n";
  239. //    s += "</html>\n";
  240.  
  241.     // Send the response to the client
  242.     client.print(s);
  243.     Serial.println(s);
  244.     delay(1);
  245.     Serial.println("Client disonnected");
  246.  
  247.     // The client will actually be disconnected
  248.     // when the function returns and 'client' object is detroyed
  249.  
  250. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement