А как-то можно заставить работать Если одновременно добавить библиотеку EthernetClient client; и EthernetServer server(80); то возникает конфликт и код не компилируется.
//--------OneWire-------------------
#include <OneWire.h>
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius;
byte address_1[8] = {0x28, 0xD8, 0x75, 0xB5, 0x05, 0x00, 0x00, 0xE1}; //1 t1
byte address_2[8] = {0x28, 0xE5, 0x46, 0xB5, 0x05, 0x00, 0x00, 0x8C}; //2 t3
OneWire ds (9);
float tw = 0; //Temperature window Температура трубы окна
float tb = 0; //Temperature balcony Температура трубы балкона
//-----------DHT--------------------
#include <dht.h>
dht dthStreet;
dht dthHome;
#define DHT_Street_PIN 3
#define DHT_Home_PIN 5
//-----------Ethernet---------------
#include <UIPEthernet.h>
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = {192,168,1,177};
//IPAddress ip(192,168,1,177);
EthernetServer server(80);
EthernetClient client;
//byte server[] = {192,168,1,2};
//----------------------------------
void setup()
{
Serial.begin (9600);
//-----------Ethernet---------------
Ethernet.begin(mac, ip);
server.begin();
//Serial.print("server is at ");
//Serial.println(Ethernet.localIP());
//----------------------------------
}
void loop()
{
//############################
if(ds.search(addr) != 1)
{
ds.reset_search();
delay(150);
for(byte i = 0; i < 10; i++) addr[i] = 0;
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1);
delay(750);
present = ds.reset ();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for(i = 0; i < 10; i++) data[i] = ds.read ();
unsigned int raw = (data[1] << 8) | data[0];
if(type_s)
{
raw = raw << 3;
if(data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6];
}
else
{
byte cfg = data[4] & 0x60;
if(cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms
else if(cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
else if(cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
}
celsius = (float)raw / 16.0;
if (!memcmp(address_1, addr, 8))
{
tw = celsius;
}
if (!memcmp(address_2, addr, 8))
{
tb = celsius;
}
Serial.print ("TW = ");
Serial.println(tw);
Serial.print ("TB = ");
Serial.println(tb);
//############################
//=====DTH==========
int chkStreet = dthStreet.read22(DHT_Street_PIN);
int chkHome = dthHome.read22(DHT_Home_PIN);
Serial.print("DHT_Street, \t");
Serial.print(dthStreet.humidity, 1);
Serial.print(",\t");
Serial.print(dthStreet.temperature, 1);
Serial.print(",\t");
Serial.println();
Serial.print("DHT_Home, \t");
Serial.print(dthHome.humidity, 1);
Serial.print(",\t");
Serial.print(dthHome.temperature, 1);
Serial.print(",\t");
Serial.println();
delay(500);
//Serial.println();
//=====DTH==========
//-----------Ethernet---------------
EthernetClient client = server.available();
if (client) {
//Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
//Serial.write(c);
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == '\n' && currentLineIsBlank)
{
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close"); // the connection will be closed after completion of the response
//client.println("Refresh: 5"); // refresh the page automatically every 5 sec
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
// output the value of each analog input pin
//=====DTH=HOME=======
client.print("\"th\":");
client.print(dthHome.temperature, 1);
client.print(",");
client.print("\"hh\":");
client.print(dthHome.humidity, 1);
client.print(",");
//=====DTH=STREET=====
client.print("\"ts\":");
client.print(dthStreet.temperature, 1);
client.print(",");
client.print("\"hs\":");
client.print(dthStreet.humidity, 1);
client.print(",");
//=====t window=====
client.print("\"tw\":");
client.println(tw);
client.print(",");
//=====t balcon=====
client.print("\"tb\":");
client.println(tb);
client.print(",");
//===============================
client.println("</html>");
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(30);
// close the connection:
client.stop();
// Serial.println("client disonnected");
}
//-----------Ethernet---------------
}
Тут я получаю данные с двух датчиков DTH и двух DS18B20, полученное отображается на веб страничке. Эту веб страничку парсят несколько устройств, приводят в читабельный вид и отображают. Теперь захотелось складывать это дело в БД. Можно, конечно, написать скрипт, который бы парсил и писал в БД, запустить его кроном... Но не хочется нагружать сервер лишними скриптами. Поэтому нужно заставить ардуинку работать ещё и в режиме клиента, и раз в 10 минут отправлять эти данные. Но как её запустиь одновременно и в режиме клиента и в режиме сервера?
А те кто уже парсят не могут пихать в БД? Тут тема когда-то жила про клиент и сервер в одном флаконе - поищите.
Пришлось поставить независимое устройство-мини сервер. А то пинг у этого шилда и так хуже некуда - 4-8сек.
Вопрос: у коде который разместил выше проходит проверка датчиков температуры по серийнику. Один прогон всей проги - показания с одного датчика, второй - со второго... И так зависит от количества датчиков, будет 200 датчиков, через 200 циклов получим показания последнего. Можно с этим что-то сделать?
Времени, в принципе, достаточно. Неудобство в том, что выводятся они по очереди. Как описать, чтоб сначала эти датчики считались, а потом дальше прога выполнялась. У меня два датчика, грубо говоря нужно сделать так, чтоб часть скетча выполнилась два раза, а остальная чать один раз, и так по кругу. Как это замутить?
А как думаете, если взять три-четыре DS18B20, поставить рядом, и усреднить их показания, то теоритически точность повысится? У меня 5 датчиков есть. Два из них один в один показывают, остальные три показывают -/+ 0,06. Нашесть сотых разбег.
У трёх DTH22 разбег по влажности на 3%, по температуре на 1,2 градуса.
Добрый день! Помогите разобраться в чем причина. Связка MEGA 2560 и ENC28J60 (подключил от внешнего источника). Скетч ниже с UNO все работает но с MEGA не пингуется. Подключал так:
VCC - 3.3V
GND - GND
SCK - Pin 52
SO - Pin 50
SI - Pin 51
CS - Pin 53 # Selectable with the ether.begin() function
# The default CS pin defaults to 8, so you have to set it on a mega:
ether.begin(sizeof Ethernet::buffer, mymac, 53)
#include <EtherCard.h> // Подключаем скачанную библиотеку. https://yadi.sk/d/R57sVoglbhTRN
#include "IRremote.h"
//#define ConditionerOn 0x8800 //on conder LG
//#define mute 0xFF28D7 //mute on comp
IRsend irsend;
//#define button1 2 // пины куда подключен радио приёмник, от радио пульта
// MAC Address должен быть уникальным в вашей сети. Можно менять.
static byte mymac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// ip статический / постоянный Address нашей Web страницы.
static byte myip[] = {
192,168,0,196 };
// Буфер, чем больше данных на Web странице, тем больше понадобится значения буфера.
byte Ethernet::buffer[900];
BufferFiller bfill;
// Массив задействованных номеров Pins Arduino, для управления например 8 реле.
int LedPins[] = {
2};
// Массив для фиксации изменений.
boolean PinStatus[] = {
1};
//-------------
const char http_OK[] PROGMEM =
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/html\r\n"
"Pragma: no-cache\r\n\r\n";
const char http_Found[] PROGMEM =
"HTTP/1.0 302 Found\r\n"
"Location: /\r\n\r\n";
const char http_Unauthorized[] PROGMEM =
"HTTP/1.0 401 Unauthorized\r\n"
"Content-Type: text/html\r\n\r\n"
"<h1>401 Unauthorized</h1>";
//------------
// Делаем функцию для оформления нашей Web страницы.
void homePage()
{
bfill.emit_p(PSTR("$F"
"<title>ArduinoPIN Webserver</title>"
"ArduinoPIN 1: <a href=\"?ArduinoPIN1=$F\">$F</a><br />"),
http_OK,
PinStatus[1]?PSTR("off"):PSTR("on"),
PinStatus[1]?PSTR("<font color=\"green\"><b>ON</b></font>"):PSTR("<font color=\"red\">OFF</font>"));
}
//------------------------
void setup()
{
Serial.begin(9600);
// По умолчанию в Библиотеке "ethercard" (CS-pin) = № 8.
// if (ether.begin(sizeof Ethernet::buffer, mymac) == 0).
// and change it to: Меняем (CS-pin) на 10.
// if (ether.begin(sizeof Ethernet::buffer, mymac, 53) == 0).
if (ether.begin(sizeof Ethernet::buffer, mymac, 53) == 0);
if (!ether.dhcpSetup());
// Выводим в Serial монитор IP адрес который нам автоматический присвоил наш Router.
// Динамический IP адрес, это не удобно, периодический наш IP адрес будет меняться.
// Нам придётся каждый раз узнавать кой адрес у нашей страницы.
ether.printIp("My Router IP: ", ether.myip); // Выводим в Serial монитор IP адрес который нам присвоил Router.
// Здесь мы подменяем наш динамический IP на статический / постоянный IP Address нашей Web страницы.
// Теперь не важно какой IP адрес присвоит нам Router, автоматический будем менять его, например на "192.168.1.222".
ether.staticSetup(myip);
ether.printIp("My SET IP: ", ether.myip); // Выводим в Serial монитор статический IP адрес.
//-----
for(int i = 0; i <= 8; i++)
{
pinMode(LedPins[i],OUTPUT);
PinStatus[i]=false;
}
}
unsigned int ConditionerOn1[60] = {8350, 4200, 550, 1650, 550, 500, 550, 550, 550, 550, 550, 1600, 550, 500, 600, 500, 600, 500, 550, 500, 550, 550, 550, 550, 550, 500, 550, 550, 550, 550, 550, 500, 550, 550, 600, 500, 550, 1600, 550, 550, 550, 1600, 550, 500, 550, 1650, 550, 500, 600, 500, 600, 1550, 600, 500, 500, 600, 500, 1650, 550};
unsigned int ConditionerOn2[60] = {8400, 4150, 600, 1550, 600, 500, 600, 450, 600, 500, 600, 1550, 600, 500, 600, 500, 600, 450, 600, 1550, 600, 1600, 600, 450, 600, 500, 600, 500, 600, 450, 600, 500, 600, 500, 600, 450, 600, 500, 600, 500, 600, 450, 600, 500, 600, 1550, 600, 500, 600, 1550, 600, 500, 600, 450, 600, 500, 600, 1550, 600};
unsigned int ConditionerOn3[60] = {8450, 4200, 550, 1550, 600, 500, 600, 450, 650, 450, 600, 1550, 650, 450, 600, 450, 650, 450, 650, 450, 600, 500, 600, 450, 650, 500, 550, 450, 650, 450, 650, 450, 600, 500, 600, 500, 600, 1550, 600, 450, 650, 1500, 650, 450, 600, 1600, 650, 400, 600, 450, 650, 1550, 600, 500, 600, 450, 600, 1600, 600};
// --------------------------------------
void loop()
{
delay(1); // Дёргаем микроконтроллер.
word len = ether.packetReceive(); // check for ethernet packet / проверить ethernet пакеты.
word pos = ether.packetLoop(len); // check for tcp packet / проверить TCP пакеты.
if (pos) {
bfill = ether.tcpOffset();
char *data = (char *) Ethernet::buffer + pos;
if (strncmp("GET /", data, 5) != 0) {
bfill.emit_p(http_Unauthorized);
}
else {
data += 5;
if (data[0] == ' ') {
homePage(); // Return home page Если обнаружено изменения на станице, запускаем функцию.
for (int i = 0; i <= 7; i++)digitalWrite(LedPins[i],PinStatus[i+1]);
}
// "16" = количество символов "?ArduinoPIN1=on ".
else if (strncmp("?ArduinoPIN1=on ", data, 16) == 0) {
PinStatus[1] = true;
irsend.sendRaw(ConditionerOn1,60,38);
delay(1*5);
irsend.sendRaw(ConditionerOn2,60,38);
delay(1*5);
irsend.sendRaw(ConditionerOn3,60,38);
bfill.emit_p(http_Found);
}
//------------------------------------------------------
else if (strncmp("?ArduinoPIN1=off ", data, 17) == 0) {
PinStatus[1] = false;
irsend.sendRaw(ConditionerOn1,60,38);
delay(1*5);
irsend.sendRaw(ConditionerOn2,60,38);
delay(1*5);
irsend.sendRaw(ConditionerOn3,60,38);
bfill.emit_p(http_Found);
}
//---------------------------
else {
// Page not found
bfill.emit_p(http_Unauthorized);
}
}
ether.httpServerReply(bfill.position()); // send http response
}
}
А как-то можно заставить работать Если одновременно добавить библиотеку EthernetClient client; и EthernetServer server(80); то возникает конфликт и код не компилируется.
где текст ошибки?
http://pixs.ru/showimage/aaaaaaaaaa_4242702_14305631.png
Вобщем есть такой говнокод:
Тут я получаю данные с двух датчиков DTH и двух DS18B20, полученное отображается на веб страничке. Эту веб страничку парсят несколько устройств, приводят в читабельный вид и отображают. Теперь захотелось складывать это дело в БД. Можно, конечно, написать скрипт, который бы парсил и писал в БД, запустить его кроном... Но не хочется нагружать сервер лишними скриптами. Поэтому нужно заставить ардуинку работать ещё и в режиме клиента, и раз в 10 минут отправлять эти данные. Но как её запустиь одновременно и в режиме клиента и в режиме сервера?
А те кто уже парсят не могут пихать в БД? Тут тема когда-то жила про клиент и сервер в одном флаконе - поищите.
А те кто уже парсят не могут пихать в БД? Тут тема когда-то жила про клиент и сервер в одном флаконе - поищите.
Пришлось поставить независимое устройство-мини сервер. А то пинг у этого шилда и так хуже некуда - 4-8сек.
Вопрос: у коде который разместил выше проходит проверка датчиков температуры по серийнику. Один прогон всей проги - показания с одного датчика, второй - со второго... И так зависит от количества датчиков, будет 200 датчиков, через 200 циклов получим показания последнего. Можно с этим что-то сделать?
Времени, в принципе, достаточно. Неудобство в том, что выводятся они по очереди. Как описать, чтоб сначала эти датчики считались, а потом дальше прога выполнялась. У меня два датчика, грубо говоря нужно сделать так, чтоб часть скетча выполнилась два раза, а остальная чать один раз, и так по кругу. Как это замутить?
Функцию написать или просто цикл.
А как думаете, если взять три-четыре DS18B20, поставить рядом, и усреднить их показания, то теоритически точность повысится? У меня 5 датчиков есть. Два из них один в один показывают, остальные три показывают -/+ 0,06. Нашесть сотых разбег.
У трёх DTH22 разбег по влажности на 3%, по температуре на 1,2 градуса.
Привет всем а как обстоят дела с UIPEthernet.h ? не зависает ли после 3-4 дней работы?
Добрый день! Помогите разобраться в чем причина. Связка MEGA 2560 и ENC28J60 (подключил от внешнего источника). Скетч ниже с UNO все работает но с MEGA не пингуется. Подключал так:
VCC - 3.3V
Спасибо! Вы спасли мне жизнь! А то ничё не работало...
Оказывается надо обязательно указывать, чтобы использовало порт №10
Переписал: ether.browseUrl(PSTR("/cgi-bin/handler.py?"),"cxem=i_love_arduno", website, callback);
Не работает все равно