Запись данных на сервер
- Войдите на сайт для отправки комментариев
Пнд, 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 соединяйся и делай запросы