Weather WebServer

f0rZzZ
Offline
Зарегистрирован: 31.01.2015

Здравстввуйте. Помогите пожалуйста. Никак не врубаюсь, как к этому году прикрутить ещё и DS18B20. Хочу чтоб в кваритире данные с DHT11 снимались и на улице DS18B20. И указать ему чтоб тоже с флешки брал картинку для веб страници, как и с дадтчика DHT11. Ах да, в коде был ещё датчик огня, но я вроде код подчистил от него, если что осталось, тоже подскажите пожалуйста. 

 

#include <dht11.h>
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#define REQ_BUF_SZ 20
#define DHT11_PIN 7
dht11 DHT;
File webFile;

char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string
char req_index = 0; // index into HTTP_req buffer
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDA, 0x02 };
IPAddress ip(192, 168, 1, 135);

EthernetServer server(80);

void setup() {
  Ethernet.begin(mac, ip);
  server.begin();
  SD.begin(4);
}

void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {

    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (req_index < (REQ_BUF_SZ - 1)) {
          HTTP_req[req_index] = c; // save HTTP request character
          req_index++;
        }
        if (c == '\n' && currentLineIsBlank) {

          if (StrContains(HTTP_req, "GET / ")) {
            // send a standard http response header
            client.println("HTTP/1.1 200 OK");

            client.println("Connection: close");

            client.println();
            client.println("<!DOCTYPE HTML>");
            client.println("<html>");
            client.println("<link rel='shortcut icon' href='favicon.ico' type='image/x-icon'>");
            client.println("<meta http-equiv='refresh' content='10'/>");
            client.println("<meta http-equiv='content-type' content='text/html; charset=UTF-8'>");
            client.println("<title>Данные с датчиков</title>");
        
            int chk;
            chk = DHT.read(DHT11_PIN);
            client.print("<img src='temp.png' />Температура = ");
            client.print(DHT.temperature);
            client.print(" °C<br/>");
            client.print("<img src='humid.png /'>Влажность = ");
            client.print(DHT.humidity);
            client.print(" %");
            client.print("</br>");
            client.print("</br>");
            client.print("<form action='http://tehnopage.ru 'target='_blank'><button type='submit' >Tehnopage.ru</button></form>");

            client.println("</html>");
          } else if (StrContains(HTTP_req, "GET /temp.png")) {
            webFile = SD.open("temp.png");
            if (webFile) {
              client.println("HTTP/1.1 200 OK");
              client.println();
            }
          }
          else if (StrContains(HTTP_req, "GET /humid.png")) {
            webFile = SD.open("humid.png");
            if (webFile) {
              client.println("HTTP/1.1 200 OK");
              client.println();
            }
          }
          else if (StrContains(HTTP_req, "GET /flame.png")) {
            webFile = SD.open("flame.png");
            if (webFile) {
              client.println("HTTP/1.1 200 OK");
              client.println();
            }
          }
          else if (StrContains(HTTP_req, "GET /favicon.ico")) {
            webFile = SD.open("favicon.ico");
            if (webFile) {
              client.println("HTTP/1.1 200 OK");
              client.println();
            }
          }
            if (webFile) {
            while (webFile.available()) {
              client.write(webFile.read()); // send web page to client
            }
            webFile.close();
          }
          
          req_index = 0;
          StrClear(HTTP_req, REQ_BUF_SZ);
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
  }
}

void StrClear(char *str, char length)
{
  for (int i = 0; i < length; i++) {
    str[i] = 0;
  }
}

char StrContains(char *str, char *sfind)
{
  char found = 0;
  char index = 0;
  char len;

  len = strlen(str);

  if (strlen(sfind) > len) {
    return 0;
  }
  while (index < len) {
    if (str[index] == sfind[found]) {
      found++;
      if (strlen(sfind) == found) {
        return 1;
      }
    }
    else {
      found = 0;
    }
    index++;
  }
  return 0;
}

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Если ответите, что означает строка:

<link rel='shortcut icon' href='favicon.ico' type='image/x-icon'>

А также, что делает кусок кода:

if (str[index] == sfind[found]) {

142       found++;
143       if (strlen(sfind) == found) {
144         return 1;

То можно продолжить разговор ;)

З.Ы. А вообще, интересно - где вы берёте такие шедевры? У меня от двух функций StrClear и StrContains уже мурашки по коже, так и до инфаркта недалеко :) особенно умиляет - в цикле while каждый раз делать strlen, зашибись :) Этот код можно сделать как минимум раз в десять быстрее работающим. Но это не суть, раз вас всё устраивает.

Хотя всё равно было бы интересно услышать ответы на поставленные вопросы ;)

f0rZzZ
Offline
Зарегистрирован: 31.01.2015

Нет, конечно же не устраивает ) Я вообще с программированием почти не дружу )) Я даже затрудняюсь ответить на ваши вопросы... ) С радостью бы был рад помощи по оптимизации )

f0rZzZ
Offline
Зарегистрирован: 31.01.2015

DIYMan пишет:

Если ответите, что означает строка:

<link rel='shortcut icon' href='favicon.ico' type='image/x-icon'>

А также, что делает кусок кода:

if (str[index] == sfind[found]) {

142       found++;
143       if (strlen(sfind) == found) {
144         return 1;

То можно продолжить разговор ;)

З.Ы. А вообще, интересно - где вы берёте такие шедевры? У меня от двух функций StrClear и StrContains уже мурашки по коже, так и до инфаркта недалеко :) особенно умиляет - в цикле while каждый раз делать strlen, зашибись :) Этот код можно сделать как минимум раз в десять быстрее работающим. Но это не суть, раз вас всё устраивает.

Хотя всё равно было бы интересно услышать ответы на поставленные вопросы ;)

Можно ещё с вами как-то связаться помимо этого форума ?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

f0rZzZ пишет:

Можно ещё с вами как-то связаться помимо этого форума ?

https://www.forumhouse.ru/threads/341712 - в этой теме сижу практически каждый день.

 

f0rZzZ
Offline
Зарегистрирован: 31.01.2015

DIYMan пишет:

f0rZzZ пишет:

Можно ещё с вами как-то связаться помимо этого форума ?

https://www.forumhouse.ru/threads/341712 - в этой теме сижу практически каждый день.

 

Ну мне бы что-то вроде вк, месенджеров )

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

f0rZzZ пишет:

Ну мне бы что-то вроде вк, месенджеров )

В вк не сижу, сорри. Так что единственный критичный по времени вариант - указанная выше ссылка, там бываю практически каждый день, там же сообщаю об обновлениях, принимаю пожелания и пр.

 

f0rZzZ
Offline
Зарегистрирован: 31.01.2015

Мне нужна помощь, указанная в начале этого поста. ЧТоб прикрутить датчик. И к тому же, может поможете оптимизировать код.

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Есть у меня код, который опрашивает датчик DS18B20, но: я использую один датчик на одном пине, чтобы не парится с адресами, поэтому этот код - специфичен для моего проекта. Если вам он чем-то поможет, ниже - класс опроса датчика.

файл DS18B20Query.h:

#ifndef _DS18B20_QUERY_H
#define _DS18B20_QUERY_H

#include <Arduino.h>
#define NO_TEMPERATURE_DATA -128 // спецзначение - нет датчика на линии
typedef struct
{
  bool Negative;
  int Whole;
  int Fract;
  
} DS18B20Temperature;

class DS18B20Support
{
  private:

  uint8_t pin;

  public:
    DS18B20Support() : pin(0) {};

    void begin(uint8_t _pin) {pin = _pin;}
    bool readTemperature(DS18B20Temperature* result); 
    
};

#endif

Файл DS18B20Query.cpp:

#include "DS18B20Query.h"
#include <OneWire.h>

bool DS18B20Support::readTemperature(DS18B20Temperature* result)
{
  result->Whole = NO_TEMPERATURE_DATA; // нет данных с датчика
  result->Fract = 0;

  if(!pin)
    return false;


  OneWire ow(pin);

  if(!ow.reset()) // нет датчика
    return false;

  byte data[9];
   
  ow.write(0xCC); // пофиг на адреса
  ow.write(0x44); // запускаем преобразование

  ow.reset();
  ow.write(0xCC); // пофиг на адреса
  ow.write(0xBE); // читаем scratchpad датчика на пине

  for(uint8_t i=0;i<9;i++)
    data[i] = ow.read();


 if ( OneWire::crc8( data, 8) != data[8]) // проверяем контрольную сумму
      return false;
  
  int loByte = data[0];
  int hiByte = data[1];

  int temp = (hiByte << 8) + loByte;
  
  result->Negative = (temp & 0x8000);
  
  if(result->Negative)
    temp = (temp ^ 0xFFFF) + 1;

  int tc_100 = (6 * temp) + temp/4;

  result->Whole = tc_100/100;
  result->Fract = tc_100 % 100;

  return true;
    
}

Использование:

DS18B20Support sensor;

sensor.begin(10); // на пине 10 повешен датчик DS18B20

DS18B20Temperature temp;
if(sensor.readTemperature(&temp))
{
Serial.print("Current temp is: ");
    if(temp.Negative)
      Serial.print("-");
Serial.print(temp.Whole);
Serial.print(",");
Serial.println(temp.Fract);
}

Но, повторюсь - это код, специфичный для моего проекта.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

f0rZzZ пишет:

Мне нужна помощь, указанная в начале этого поста. ЧТоб прикрутить датчик. И к тому же, может поможете оптимизировать код.

Что касается оптимизации кода - это работа вдумчивая, и у меня на неё сейчас просто нет времени, да и желания, так что - извините.

f0rZzZ
Offline
Зарегистрирован: 31.01.2015

Спасибо за код. Мне как раз нужен всего один датчик уличный.