Запись данных на сервер

Демьян
Offline
Зарегистрирован: 10.07.2013

Вообщем потихоньку собирая "умный дом" возникла потребность записи показаний температуры в помещении на tinywebdb, дабы оттуда получало информацию с датчика приложение на андроид смартфоне, но в коде соображаю слабо, поэтому стараюсь искать нужные куски кода в разных скетчах и объединять их, ну и дописываю иногда по мелочи, и вот никак не пойму, как организовать то, что мне нужно.

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

#define DHT11_PIN 0
byte read_dht11_dat()
{
  byte i = 0;
  byte result=0;
  for(i=0; i< 8; i++)
  {
    while(!(PINC & _BV(DHT11_PIN)))
    {
    }; // Ждем, пока на 0 аналоговом порте не будет '1'
    delayMicroseconds(30);
    if(PINC & _BV(DHT11_PIN)) // Если после 30 мкс на 0 аналоговом порте до сих пор '1'
      result |=(1<<(7-i)); // Записываем результат
    while((PINC & _BV(DHT11_PIN))); // Ждем окончания '1'
  }
  return result;
}
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес
byte ip[] = { 192, 168, 0, 105 }; // IP адрес (В броузере вводим 192.168.0.2)
EthernetServer server(80);

int numPins = 1;
int pins[] = { 2 };    // Пины для реле
int pinState[] = {1, 1, 1, 1};  // Состояние пинов
void setup()
{
  DDRC |= _BV(DHT11_PIN); // Устанавливаем 0 аналоговый порт, как output
  PORTC |= _BV(DHT11_PIN); // Устанавливаем начальное значение порта в '1'
  Serial.println("Ready");
  // Изначально выключаем все реле
  for (int i = 0; i < numPins; i++)
  {
    pinMode(pins[i], OUTPUT);
    digitalWrite(pins[i], 1);
  }
  
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop()
{
byte dht11_dat[5];
  byte dht11_in;
  byte i;
  PORTC &= ~_BV(DHT11_PIN); 
  delay(18);
  PORTC |= _BV(DHT11_PIN);
  delayMicroseconds(1);
  DDRC &= ~_BV(DHT11_PIN); // Устанавливаем 0 аналоговый порт, как input 

  delayMicroseconds(40);
  dht11_in = PINC & _BV(DHT11_PIN); // считываем только 0 порт
  if(dht11_in)
  {
    //Serial.println("dht11 start condition 1 not met"); // Ждем ответ от DHT:  LOW

    delay(1000);
    return;
  }
  delayMicroseconds(80);
  dht11_in = PINC & _BV(DHT11_PIN); //
  if(!dht11_in)
  {
    //Serial.println("dht11 start condition 2 not met"); // Ждем второй ответ от DHT: HIGH
    return;
  }
  delayMicroseconds(80);// Готовимся к приему данных
  for (i=0; i<5; i++)
  { 
    dht11_dat[i] = read_dht11_dat();
  } // Получаем 40 бит данных
  DDRC |= _BV(DHT11_PIN); // Устанавливаем 0 аналоговый порт в положение output, после того, как все данные получены
  PORTC |= _BV(DHT11_PIN); // Устанавливаем значение этого порта в '1', после того, как все данные получены
  byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];// Проверяем контрольную сумму
  if(dht11_dat[4]!= dht11_check_sum)
  {
    //Serial.println("DHT11 checksum error");
  }
  Serial.print("Current humdity = ");
  Serial.print(dht11_dat[0], DEC);
  Serial.print(".");
  Serial.print(dht11_dat[1], DEC);
  Serial.print("% ");
  Serial.print("temperature = ");
  Serial.print(dht11_dat[2], DEC);
  Serial.print(".");
  Serial.print(dht11_dat[3], DEC);
  Serial.println("C ");
  delay(2000); // Время ожидания датчика
  EthernetClient client = server.available();
  if (client)
  {
    // Проверяем подключен ли клиент к серверу
    while (client.connected())
    {
      // Проверяем идет ли запрос к серверу
      int dataCount = client.available();
      if (dataCount > 0)
      {
        // Считываем данные передаваемые серверу с клиента (броузера)
        for (int i = 0; i < dataCount; i++)
        {
          char ch = client.read();
          // Если данные передаются, то они будут переданы POST запросом, который начинается с символа 'P'
          if (i == 0 && ch != 'P')
            break;
          if (ch == '\n' && i < dataCount - 1)
          {
             // Находим строку, в которой содержатся передаваемые данные
             char chNext = client.read();
             // Формат строки r2=on&r3=on&r4=on (Пример если нужно включены 2,3,4 реле)
             if (chNext == 'r')
             {
               // Выключаем все реле
               pinState[0] = 0;
               
               // Считываем первый номер реле, который нужно включить
               char relayNum = client.read();
               pinState[relayNum-'0'] = 1;
               Serial.write(relayNum);
               
               // Считываем вспомогательную информацию (=on&)
               relayNum = client.read();
               relayNum = client.read();
               relayNum = client.read();
               relayNum = client.read();
                
               // Пока есть данные об остальных реле, считываем и заносим в массив pinState
               while (relayNum != -1)
               {
                  relayNum = client.read();
                  relayNum = client.read();
                  pinState[relayNum-'0'] = 1;
                  Serial.write(relayNum);
                  relayNum = client.read();
                  relayNum = client.read();
                  relayNum = client.read();
                  relayNum = client.read();
               }
             } else
             {
                // Если не было передано данных, то выключаем все реле
                pinState[0] = 0;
             }
          }
        }
      }
      
      // В соответствие с переданными данными включаем реле
      for (int i = 0; i < 4; i++)
      {
         digitalWrite(pins[i], !pinState[i]);
      }
      
      // Выводим HTML страницу, на которой пользователь может включить или выключить нужные ему реле
      client.println("HTTP/1.1 200 OK");
      client.println("Content-Type: text/html ; charset=utf-8");
      client.println();
      client.println("<html>");
      client.println("<head>");
      client.println("<title></title>");
      client.println("</head>");
      client.println("<body>");
      client.println("<center><h3></h3></center>");
      client.println("");
      client.println("<form method='post'>");
      client.print("<center>Вентилятор</center>");
      client.println("<br/>");
      client.print("Управление<input type='checkbox'");
      if (pinState[0] == 1)
      client.print("checked");
      client.println(" name='r0'></div>");
      client.println("<br/>");
      client.println("<br/>");
      client.println("<input type='submit' value='Вкл/Выкл'>");
      client.println("<br/>");
      client.println("<br/>");
      client.println("");
      client.println("<br/>");
      client.println("<br/>");
      client.print("<u><b>Влажность в помещении</u> - <b>");
      client.print(dht11_dat[0], DEC);
      client.print(".");
      client.print(dht11_dat[1], DEC);
      client.print("%");
      client.println("<br/>");
      client.print("<u><b> Температура в помещении</u> - </b>");
      client.print(dht11_dat[2], DEC);
      client.print(".");
      client.print(dht11_dat[3], DEC);
      client.println("C ");("<br/>");
      client.println("<br/>");
      client.println("<br/>");
      client.println("");
      client.println();
      client.println("</form>");
      client.println("</body>");
      client.println("</html>");
      client.stop(); 
    }
  }
}

 

Демьян
Offline
Зарегистрирован: 10.07.2013

Так что, никто не знает как реализовать запись?

Клапауций
Offline
Зарегистрирован: 10.02.2013

я знаю, как светодиодом мигать - показать?

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Непонятно в чем вопрос - нужно сохранять показания для построения графика(по времени)? или что?

Демьян
Offline
Зарегистрирован: 10.07.2013

График не нужен, нужно просто сохранить данные влажности и температуры, которые выводятся как вэб-страница в конце скетча.
ЗЫ Пример работы со светодиодом не помешает. =)

Geronimo
Offline
Зарегистрирован: 06.05.2013

Как вариант, с помощбю езернет шилда дергать веб-сервис на компе который будет класть данные в СУБД

Демьян
Offline
Зарегистрирован: 10.07.2013

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

hukmaos
Offline
Зарегистрирован: 11.05.2014

А где конкретно находится БД? Подники на каком то удаленном ПК сервер и к нему через tcp ip  соединяйся и делай запросы