Запись данных на сервер
- Войдите на сайт для отправки комментариев
Пнд, 28/04/2014 - 06:07
Вообщем потихоньку собирая "умный дом" возникла потребность записи показаний температуры в помещении на 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();
}
}
}
Так что, никто не знает как реализовать запись?
я знаю, как светодиодом мигать - показать?
Непонятно в чем вопрос - нужно сохранять показания для построения графика(по времени)? или что?
График не нужен, нужно просто сохранить данные влажности и температуры, которые выводятся как вэб-страница в конце скетча.
ЗЫ Пример работы со светодиодом не помешает. =)
Как вариант, с помощбю езернет шилда дергать веб-сервис на компе который будет класть данные в СУБД
Это всё же не катит, мне нужно в связке с тинидб, вообщем то можно и мускул юзать, но лучше первое, главная проблема у меня в коде, нужно в скетч добавить подключение к серверу и запись на него, а то дальше продвинуться не могу в реализации.
А где конкретно находится БД? Подники на каком то удаленном ПК сервер и к нему через tcp ip соединяйся и делай запросы