Облако тегов

Глобус

Навигация

Вход на сайт

  • Войти с Twitter

Подключение Arduino Pro Mini + Enc28j60 + DHT11 + DS18B20 к сервису narodmon.ru

Сломалась дома проводная китайская погодная станция. Решил сделать свою. Уже несколько раз смотрел на сервис narodmon.ru да повода не было.

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

 

Читать далее...

В конце должно получиться примерно так:

 

Сначал очень быстро сделал по примерам с сайта "градусник" на базе x-board v2. Это ардуина сразу с портом ethernet на борту. Чип на ней совместим со стандартной библиотекой Ethernet шилдов. Тем, кто мало знаком с ардуино, я рекомендую использовать стандартные ethernet шилды на базе чипа Wiznet. Их единственный недостаток, что они большие. Зато, они легко программируются, под них полно готовых примеров как для web- сервера, так и для клиента. Но я почему-то решил остановиться на меньшем по размеру сетевом модуле на базе Enc28j60 и маленькой Arduino Pro Mini. Намучался с Enc28j60, но теперь все работает. А Arduino Pro Mini - просто сказка!

Что я использовал:

1. Датчик температуры и влажности DHT-11

2. Датчик температуры для улицы DS18B20:

3. Arduino Pro Mini (3.3 вольта - это важно!)

 

4. Сетевой модуль Enc28j60 для отправки данных в интернет.

 

5. Макетная плата и соединительные провода.

6. Забыл про то, что плата Arduino Pro Mini (как и x-board) не имеет интерфейса USB для программирования, поэтому понадобится он (мой шел в комплекте с xboard), но они везде продаются отдельно:

 

Подключение:

Arduino Enc28j60
10 CS
11 SI
12 SO
13 SCK
3.3v 3.3V
GND GND

DHT11 подключаем по схеме как на первом рисунке Через резистор между питанием и дата. Вместо 5в можно использовать 3.3в. Датчик прекрасно работает. Дата пин=6.

DS18B20 так же подключаем через резистор по следующей схеме:

Он работает по протоколу 1Wire и к одному пину ардуины можно подключить несколько датчиков подряд. Аналогично питание датчика берем с 3.3в. Дата пин=2.

 

Программируем: (обратите внимание, что необходимо указать уникальный MAC адрес сетевого интерфейса, по нему сервис narodmon.ru будет идентифицировать ваше устройство и ip адрес и порт сайта narodmon.ru). По правилам narodmon.ru запрещается публиковать реквизиты на сторонних ресурсах. Посмотреть их можно тут:  В скетче адрес изменен.

static byte mac[] = { 0xE0, 0xCB, 0x11, 0xFF, 0x44, 0x77 }; //В этой строке задайте свой MAC адрес

static byte hisip[] = { 99,99,99,99,8080 };//Здесь надо указать IP адрес сайта narodmon.ru

Скетч для ардуины собирался из разных мест, поэтому в нем присутствует немного бардака. Не нашел описание работы Enc28j60 как клиента. К счастью, есть пример, где используется для этого объект Stash. И он отлично работает. Однако в самой библиотеке, в описании объекта есть фраза о том, что обычно его не надо использовать напрямую. Но мне кажется это единственный способ.

#include <OneWire.h>
#include <DallasTemperature.h>
#include <EtherCard.h>

#include <dht11.h>

 

#define DHT11PIN 6
#define ONE_WIRE_BUS 2                             // Data wire is plugged into digital pin 3 on the Arduino
#define NumberOfDevices 8                          // Set maximum number of devices in order to dimension

#define led  13
#define REQUEST_RATE 300000 // milliseconds

static byte mac[] = { 0xE0, 0xCB, 0x11, 0xFF, 0x44, 0x77 }; //В этой строке задайте свой MAC адрес
static byte hisip[] = { 99,99,99,99,8080 };Здесь надо указать IP адрес сайта narodmon.ru

dht11 sensor;
OneWire oneWire(ONE_WIRE_BUS);                     // Setup a oneWire instance to communicate with any OneWire devices

DallasTemperature sensors(&oneWire);               // Pass our oneWire reference to Dallas Temperature.

byte allAddress [NumberOfDevices][8];              // Device Addresses are 8-element byte arrays.
                                                   // we need one for each of our DS18B20 sensors.

byte totalDevices;                                 // Declare variable to store number of One Wire devices
                                                   // that are actually discovered.

byte discoverOneWireDevices() {
  byte j=0;                                        // search for one wire devices and
                                                   // copy to device address arrays.
  while ((j < NumberOfDevices) && (oneWire.search(allAddress[j]))) {        
    j++;
  }
   return j                      ;                 // return total number of devices found.
}
String macstring;
String DSstring[NumberOfDevices];
byte Ethernet::buffer[700];
static long timer;
Stash stash;  

void setup() {
  Serial.begin(57600);
  delay(1000);

  if (ether.begin(sizeof Ethernet::buffer, mac, SS) == 0)
    Serial.println( "Failed to access Ethernet controller");

  if (!ether.dhcpSetup())
    Serial.println("DHCP failed");
    
  //overwrite DNS with google's if there are problems with DNS setup
  static byte dnsip[] = {8,8,8,8};
  ether.copyIp(ether.dnsip, dnsip);
 
  ether.printIp("My IP: ", ether.myip);
  ether.printIp("GW IP: ", ether.gwip);
  ether.printIp("DNS IP: ", ether.dnsip);

  ether.copyIp(ether.hisip, hisip);
  ether.printIp("Server: ", ether.hisip);

  while (ether.clientWaitingGw())
    ether.packetLoop(ether.packetReceive());
  Serial.println("Gateway found");

  macstring="";
  for(int k=0;k<sizeof(mac)/sizeof(byte);k++)
  {
        char msg[3];
        sprintf(msg,"%02X",mac[k]);
        //if (macstring!="#") macstring+="-";
        macstring+=msg;
  }
    
  pinMode(led, OUTPUT);

  sensors.begin();
  totalDevices = discoverOneWireDevices();
  for (byte i=0; i < totalDevices; i++)
  {
    DSstring[i]="";
    for(int k=7;k>=0;k--)
    {
          char msg[3];
          sprintf(msg,"%02X",allAddress[i][k]);
          DSstring[i]+=msg;
    };
   
    sensors.setResolution(allAddress[i], 10);      // and set the a to d conversion resolution of each.
  }
 
  timer = - REQUEST_RATE; // start timing out right away
}

void loop() {
 
  ether.packetLoop(ether.packetReceive());
 
  if (millis() > timer + REQUEST_RATE)
  {
    timer = millis();

    byte sd = stash.create();
    stash.print("ID=");
    stash.print(macstring);

    Serial.println("\n\n\nPosting...\n");
    digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(100);               // wait for a second
    digitalWrite(led, LOW);
    
    sensors.requestTemperatures();                // Initiate  temperature request to all devices
    String result;
    char msg[50];
    result=macstring+"\n";
    String temp;
    for (byte i=0; i < totalDevices; i++) {
      float tempC = sensors.getTempC(allAddress[i]);           // read the device at addr.
      if (tempC != -127.00)
      {
        //dtostrf(tempC,10,2,msg);
        stash.print("&");
        stash.print(DSstring[i]);
        stash.print("=");
        stash.print(tempC);
      }
    }
 
    int chk = sensor.read(DHT11PIN);
    if (chk==DHTLIB_OK)
    {      
          stash.print("&");
          stash.print(macstring);
          stash.print("01");
          stash.print("=");
          stash.print(sensor.temperature);

          stash.print("&");
          stash.print(macstring);
          stash.print("02");
          stash.print("=");
          stash.print(sensor.humidity);
    }
    else
      switch (chk)
      {
        case DHTLIB_ERROR_CHECKSUM:
             Serial.println("Checksum error");
             break;
        case DHTLIB_ERROR_TIMEOUT:
             Serial.println("Time out error");
             break;
        default:
             Serial.println("Unknown error");
             break;
      }
    
    stash.save();

    // generate the header with payload - note that the stash size is used,
    // and that a "stash descriptor" is passed in as argument using "$H"
    Stash::prepare(PSTR("POST http://narodmon.ru/post.php HTTP/1.0" "\r\n"
                        "Host: narodmon.ru" "\r\n"
                        "Content-Length: $D" "\r\n"
                        "\r\n"
                        "$H"),
                  stash.size(), sd);

    // send the packet - this also releases all stash buffers once done
    ether.tcpSend();

    Serial.println("Done");
  }
}

 

Понадобятся 4 библиотеки:

#include <OneWire.h>
#include <DallasTemperature.h>
#include <EtherCard.h>
#include <dht11.h>

Они в приложении, в конце поста.

Вот такой график со временем будет на сайте народмон:

 

PS. Опытный ардуинщик заметит на первом фото радио-трансивер NRF24L01. О том как сделать беспроводной датчик, расскажу в следующем посте.

 

Комментарии

Здравствуйте , решил  повторить конструкцию  -   ругается  на  строку dth11 sensor;

Добрый день!

В приложениях есть файл с библиотеками. Их надо подключить.

Есть два способоа:

1.Меню: Скетч->Импортировать библиотеку->Add library.. И далее выбрать папку DHT11. И так для каждой папки в архиве.

2. Скопировать все папки из архива с библиотеками в "Мои документы" в папку arduino/libraries и перезапустить Arduino

Здравствуйте , решил  повторить конструкцию  -   ругается  на  строку dth11 sensor;

Вот выкинул все ненужное . Значение температуры потом подставлю. Так сказать шаблон хотел сделать для отправки. А оно не работает. Может подскажете в чем дело?

#include <EtherCard.h>

String mac ="90A0D0001010";
float tempC = 0;

// ethernet interface mac address, must be unique on the LAN
byte mymac[] = { 0x90,0xa0,0xd0,0x00,0x10,0x10 };

//char website[] PROGMEM = "narodmon.ru:8080";
static byte hisip[] = { 91,122,49,168,8080 }; //Здесь надо указать IP адрес сайта narodmon.ru

byte Ethernet::buffer[700];
uint32_t timer;
Stash stash;

static char statusstr[10];

void setup () {
Serial.begin(57600);
Serial.println("\n[webClient]");

if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0)
Serial.println( "Failed to access Ethernet controller");
if (!ether.dhcpSetup())
Serial.println("DHCP failed");

ether.printIp("IP: ", ether.myip);
ether.printIp("GW: ", ether.gwip);
ether.printIp("DNS: ", ether.dnsip);

//if (!ether.dnsLookup(website))
//Serial.println("DNS failed");

//ether.printIp("SRV: ", ether.hisip);

ether.copyIp(ether.hisip, hisip);
  ether.printIp("Server: ", ether.hisip);

}

void loop () {
//word len = ether.packetReceive();
//word pos = ether.packetLoop(len);

// we can determine the size of the generated message ahead of time
byte sd = stash.create();

stash.print("ID=");
stash.print(mac);
stash.print("&");
        stash.print(mac);
         stash.print("01");
        stash.print("=");
        stash.print(tempC);

 stash.save();
    // generate the header with payload - note that the stash size is used,
    // and that a "stash descriptor" is passed in as argument using "$H"
    Stash::prepare(PSTR("POST http://narodmon.ru/post.php HTTP/1.0" "\r\n"
                        "Host: narodmon.ru" "\r\n"
                        "Content-Length: $D" "\r\n"
                        "\r\n"
                        "$H"),
                  stash.size(), sd);
    // send the packet - this also releases all stash buffers once done
    ether.tcpSend();
    Serial.println("Done");
 
 Serial.println("Pause start");
 delay(600000);
 Serial.println("Pause end");

}

Что выдает здесь: http://narodmon.ru/ip.php  ?

 

 

Данных c IP ****** за последний час не поступало.

Слишком много нужного удалили :)

Взял ваш скрипт и начал добавлять удаленное, пока не заработало. Много надобавлял обратно. в том числе нужное :)

Адрес и порт поменял, вернул прослушку сетевых пакетов и самое главное вернул задержку через timer. Здесь нельзя использовать delay, оно блокирует работу ардуины, не давая в том числе отсылать данные по сети и принимать ответы.

#include <EtherCard.h>

String mac ="90A0D0001010";
float tempC = 0;

// ethernet interface mac address, must be unique on the LAN
byte mymac[] = { 0x90,0xa0,0xd0,0x00,0x10,0x10 };

//char website[] PROGMEM = "narodmon.ru:8080";
static byte hisip[] = { 94,19,113,221,8283 };

#define REQUEST_RATE 300000 // milliseconds

byte Ethernet::buffer[700];
uint32_t timer;
Stash stash;

static char statusstr[10];

void setup () {
Serial.begin(57600);
Serial.println("\n[webClient]");
delay(1000);
if (ether.begin(sizeof Ethernet::buffer, mymac, SS) == 0)
Serial.println( "Failed to access Ethernet controller");
if (!ether.dhcpSetup())
Serial.println("DHCP failed");
  //overwrite DNS with google's if there are problems with DNS setup
  static byte dnsip[] = {8,8,8,8};
  ether.copyIp(ether.dnsip, dnsip);

ether.printIp("IP: ", ether.myip);
ether.printIp("GW: ", ether.gwip);
ether.printIp("DNS: ", ether.dnsip);

  ether.copyIp(ether.hisip, hisip);
  ether.printIp("Server: ", ether.hisip);

  while (ether.clientWaitingGw())
    ether.packetLoop(ether.packetReceive());
  Serial.println("Gateway found");
  timer = - REQUEST_RATE; // start timing out right away

}

void loop () {
//word len = ether.packetReceive();
//word pos = ether.packetLoop(len);
  ether.packetLoop(ether.packetReceive());

  if (millis() > timer + REQUEST_RATE)
  {
    timer = millis();

// we can determine the size of the generated message ahead of time
byte sd = stash.create();

stash.print("ID=");
stash.print(mac);
stash.print("&");
        stash.print(mac);
         stash.print("07");
        stash.print("=");
        stash.print(tempC);

 stash.save();
 
Serial.print("ID=");
Serial.print(mac);
Serial.print("&");
        Serial.print(mac);
         Serial.print("07");
        Serial.print("=");
        Serial.println(tempC);
 
 
 
    // generate the header with payload - note that the stash size is used,
    // and that a "stash descriptor" is passed in as argument using "$H"
    Stash::prepare(PSTR("POST http://narodmon.ru/post.php HTTP/1.0" "\r\n"
                        "Host: narodmon.ru" "\r\n"
                        "Content-Length: $D" "\r\n"
                        "\r\n"
                        "$H"),
                  stash.size(), sd);

    // send the packet - this also releases all stash buffers once done
    ether.tcpSend();

    Serial.println("Done");
 
 //Serial.println("Pause start");
 //delay(10000);
 //Serial.println("Pause end");
  }
}

У меня отсылает в таком виде. http://narodmon.ru/ip.php :

2014-05-03T12:35:33+04:00
POST
ID=90A0D0001010&90A0D000101007=0.00
игнор

игнор - потому что мак не мой. там ограничение на 1 мак с одного айпи. с моим маком пишет "обработано".

Благодарю.. Работает только как то неустойчиво ip получает от dhcp .

Часто зависает после надписи [webClient] . Отпускает только после пары сбросов.

 

Чето я непонял . Закрываю монитор порта - перестает передавать..

Толи лыжи не едут........

По первому, может задать статический IP? Там в примерах есть как. Про второе - мистика, я с таким не сталкивался :)

я бы хотел к вашему коду, прикрутить ещё код BMP180 http://codepad.org/tInZOoeJ
возможно ли это? или покажите как и куда его вставить. ибо у меня чет не получается. если я вставляю код вмр180 то не происходит отправка на сайт. данных. но в мониторе видно что датчик работает.

Сделал на основе вашего кода свой - не заработал. Начал кусками копировать - не работает. Взял целиком... не работает.

на narodmon/ip.php выдает нечто вроде 2014-08-03T12:15:33+04:00 API {guid....

tcpdump показывает, что данные отправляются по ip 0.0.0.0. В чем может быть проблема?

Добавлю:

static uint8_t myip[4] = {192,168,1,88};
static uint8_t gwip[4] = {192,168,1,1};
static byte dnsip[] = {8,8,8,8};
static byte hisip[] = {94,19,113,221,8080};

причем hisip я пробовал ставить и без порта и все три народионовских ип.

 Всё отлично работает ! Хотел к Вашему скетчу приспособить датчик давления BMP085 , но у самого никак не получается , у Вас не возникало такого желания? Кто нибудь может приспособить барометр?

Залил первый скетч но что-то не работает мак менял на свой и сервер с портом 8283 тоже. А подключение arduino - enc28j60 по выводу 10 и CS или нужно на 8 пин посадить.

Здравствуйте, все работает отлично. Но тоже очень хочется дополнить датчиком давления, но никак не получается.

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

#include <Wire.h>
#include <BMP085.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EtherCard.h>
#include <dht11.h>
 
#define DHT11PIN 6
#define ONE_WIRE_BUS 2                             // Data wire is plugged into digital pin 3 on the Arduino
#define NumberOfDevices 8                          // Set maximum number of devices in order to dimension
#define led  13
#define REQUEST_RATE 300000 // milliseconds
BMP085 dps = BMP085();      // Digital Pressure Sensor 

long Temperature = 0, Pressure = 0, Altitude = 0, dav = 0;

static byte mac[] = { 0xD4, 0xCA, 0x6D, 0x53, 0x9D, 0x00 }; //В этой строке задайте свой MAC адрес
char mak[]="D4CA6D539D00";
static byte hisip[] = { 94,19,113,221 };//Здесь надо указать IP адрес сайта narodmon.ru
dht11 sensor;
OneWire oneWire(ONE_WIRE_BUS);                     // Setup a oneWire instance to communicate with any OneWire devices
DallasTemperature sensors(&oneWire);               // Pass our oneWire reference to Dallas Temperature.
byte allAddress [NumberOfDevices][8];              // Device Addresses are 8-element byte arrays.
                                                   // we need one for each of our DS18B20 sensors.
byte totalDevices;                                 // Declare variable to store number of One Wire devices
                                                   // that are actually discovered.
byte discoverOneWireDevices() {
  byte j=0;                                        // search for one wire devices and
                                                   // copy to device address arrays.
  while ((j < NumberOfDevices) && (oneWire.search(allAddress[j]))) {        
    j++;
  }
   return j                      ;                 // return total number of devices found.
}
String macstring;
String DSstring[NumberOfDevices];
byte Ethernet::buffer[700];
static long timer;
Stash stash;  

unsigned long time1=0;

void setup() {
  Serial.begin(57600);
   Wire.begin();
   delay(1000);
  dps.init();
  // note: use zeroCal only after initialization.
  // dps.zeroCal(101800, 0);    // set zero point
  if (ether.begin(sizeof Ethernet::buffer, mac, SS) == 0)
    Serial.println( "Failed to access Ethernet controller");
  if (!ether.dhcpSetup())
    Serial.println("DHCP failed");
    
  //overwrite DNS with google's if there are problems with DNS setup
  static byte dnsip[] = {8,8,8,8};
  ether.copyIp(ether.dnsip, dnsip);
 
  ether.printIp("My IP: ", ether.myip);
  ether.printIp("GW IP: ", ether.gwip);
  ether.printIp("DNS IP: ", ether.dnsip);
  ether.copyIp(ether.hisip, hisip);
  ether.printIp("Server: ", ether.hisip);
  while (ether.clientWaitingGw())
    ether.packetLoop(ether.packetReceive());
  Serial.println("Gateway found");
  macstring="";
  for(int k=0;k<sizeof(mac)/sizeof(byte);k++)
  {
        char msg[3];
        sprintf(msg,"%02X",mac[k]);
        //if (macstring!="#") macstring+="-";
        macstring+=msg;
  }
    
  pinMode(led, OUTPUT);
  sensors.begin();
  totalDevices = discoverOneWireDevices();
  for (byte i=0; i < totalDevices; i++)
  {
    DSstring[i]="";
    for(int k=7;k>=0;k--)
    {
          char msg[3];
          sprintf(msg,"%02X",allAddress[i][k]);
          DSstring[i]+=msg;
    };
   
    sensors.setResolution(allAddress[i], 10);      // and set the a to d conversion resolution of each.
  }
 
  timer = - REQUEST_RATE; // start timing out right away
}
void loop() {
 
  if (((millis() - time1)/1000.0) >= 1.0) {     
     dps.calcTrueTemperature();
     time1 = millis();      
  }
 
  dps.getPressure(&Pressure);
  dps.getAltitude(&Altitude);
  dav=Pressure/133.3224;
  ether.packetLoop(ether.packetReceive());
 
  if (millis() > timer + REQUEST_RATE)
  {
    timer = millis();
    byte sd = stash.create();
    stash.print("ID=");
    stash.print(mak);
    Serial.println("\n\n\nPosting...\n");
    Serial.println(mak);
    digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(100);               // wait for a second
    digitalWrite(led, LOW);
    
    sensors.requestTemperatures();                // Initiate  temperature request to all devices
    String result;
    char msg[50];
    result=macstring+"\n";
    String temp;
    for (byte i=0; i < totalDevices; i++) {
      float tempC = sensors.getTempC(allAddress[i]);           // read the device at addr.
      if (tempC != -127.00)
      {
        //dtostrf(tempC,10,2,msg);
       // stash.print("&");
       // stash.print(DSstring[i]);
       // stash.print("=");
       // stash.print(tempC);
      }
    }
 
    int chk = sensor.read(DHT11PIN);
    if (chk==DHTLIB_OK)
    {     
          stash.print("&");
          stash.print(mak);
          stash.print("01");
          stash.print("=");
          stash.print(sensor.temperature);
          stash.print("&");
          stash.print(mak);
          stash.print("02");
          stash.print("=");
          stash.print(sensor.humidity);
          stash.print("&");
          stash.print(mak);
          stash.print("03");
          stash.print("=");
          stash.print(dav);
          Serial.println(Pressure);
          Serial.println(dav);
    }
    else
      switch (chk)
      {
        case DHTLIB_ERROR_CHECKSUM:
             Serial.println("Checksum error");
             break;
        case DHTLIB_ERROR_TIMEOUT:
             Serial.println("Time out error");
             break;
        default:
             Serial.println("Unknown error");
             break;
      }
    
    stash.save();
    // generate the header with payload - note that the stash size is used,
    // and that a "stash descriptor" is passed in as argument using "$H"
    Stash::prepare(PSTR("POST http://narodmon.ru/post.php HTTP/1.0" "\r\n"
                        "Host: narodmon.ru" "\r\n"
                        "Content-Length: $D" "\r\n"
                        "\r\n"
                        "$H"),
                  stash.size(), sd);
    // send the packet - this also releases all stash buffers once done
    ether.tcpSend();
    Serial.println("Done");
  }
}

 

НЕ забываем добавить библиотеки.

Спасибо, за датчик давления. А как сделать чтобы ds заработал? 

Попробовал последний вариант с BMP085 (остальные датчики еще в пути)

Arduino Nano V3 + ENC28J60  + BMP085

Такое впечатление , что BMP085 не видится в мониторе порта .

"Gateway found

Posting...

000C43701234
Time out error
Done"

У меня подключен к SDA-A4  SCL-A5, скетчи "примеров" работают.

Куда в скетче будет правильно воткнуть вывод в монитор порта состояние датчика ?

 

Вот так все датчики работают и Ds18b20 Одна проблема отсылается только один раз на народдом при подаче питания потом проподает сетевой интерфейс(минут через 5) на пинг на отвечает передернув питание снова один раз отослала и пропал мож кто поглядит в чем загвоздка 

#include <Wire.h>
#include <BMP085.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EtherCard.h>
#include <dht11.h>
 
#define DHT11PIN 6
#define ONE_WIRE_BUS 4                             // Data wire is plugged into digital pin 3 on the Arduino
#define NumberOfDevices 8                          // Set maximum number of devices in order to dimension
#define led  13
#define REQUEST_RATE 300000 // milliseconds
BMP085 dps = BMP085();      // Digital Pressure Sensor 

long Temperature = 0, Pressure = 0, Altitude = 0, dav = 0;

static byte mac[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; //В этой строке задайте свой MAC адрес
char mak[]="DEADBE002712";
static byte hisip[] = { 94,19,113,221 };//Здесь надо указать IP адрес сайта narodmon.ru
dht11 sensor;
OneWire oneWire(ONE_WIRE_BUS);                     // Setup a oneWire instance to communicate with any OneWire devices
DallasTemperature sensors(&oneWire);               // Pass our oneWire reference to Dallas Temperature.
byte allAddress [NumberOfDevices][8];              // Device Addresses are 8-element byte arrays.
                                                   // we need one for each of our DS18B20 sensors.
byte totalDevices;                                 // Declare variable to store number of One Wire devices
                                                   // that are actually discovered.
byte discoverOneWireDevices() {
  byte j=0;                                        // search for one wire devices and
                                                   // copy to device address arrays.
  while ((j < NumberOfDevices) && (oneWire.search(allAddress[j]))) {        
    j++;
  }
   return j                      ;                 // return total number of devices found.
}
String macstring;
String DSstring[NumberOfDevices];
byte Ethernet::buffer[700];
static long timer;
Stash stash;  

unsigned long time1=0;

void setup() {
  Serial.begin(57600);
   Wire.begin();
   delay(1000);
  dps.init();
  // note: use zeroCal only after initialization.
  // dps.zeroCal(101800, 0);    // set zero point
  if (ether.begin(sizeof Ethernet::buffer, mac, SS) == 0)
    Serial.println( "Failed to access Ethernet controller");
  if (!ether.dhcpSetup())
    Serial.println("DHCP failed");
    
  //overwrite DNS with google's if there are problems with DNS setup
  static byte dnsip[] = {8,8,8,8};
  ether.copyIp(ether.dnsip, dnsip);
 
  ether.printIp("My IP: ", ether.myip);
  ether.printIp("GW IP: ", ether.gwip);
  ether.printIp("DNS IP: ", ether.dnsip);
  ether.copyIp(ether.hisip, hisip);
  ether.printIp("Server: ", ether.hisip);
  while (ether.clientWaitingGw())
    ether.packetLoop(ether.packetReceive());
  Serial.println("Gateway found");
  macstring="";
  for(int k=0;k<sizeof(mac)/sizeof(byte);k++)
  {
        char msg[3];
        sprintf(msg,"%02X",mac[k]);
        //if (macstring!="#") macstring+="-";
        macstring+=msg;
  }
    
  pinMode(led, OUTPUT);
  sensors.begin();
  totalDevices = discoverOneWireDevices();
  for (byte i=0; i < totalDevices; i++)
  {
    DSstring[i]="";
    for(int k=7;k>=0;k--)
    {
          char msg[3];
          sprintf(msg,"%02X",allAddress[i][k]);
          DSstring[i]+=msg;
    };
   
    sensors.setResolution(allAddress[i], 10);      // and set the a to d conversion resolution of each.
  }
 
  timer = - REQUEST_RATE; // start timing out right away
}
void loop() {
 
  if (((millis() - time1)/1000.0) >= 1.0) {     
     dps.calcTrueTemperature();
     time1 = millis();      
  }
 
  dps.getPressure(&Pressure);
  dps.getAltitude(&Altitude);
  dav=Pressure/133.3224;
  ether.packetLoop(ether.packetReceive());
 
  if (millis() > timer + REQUEST_RATE)
  {
    timer = millis();
    byte sd = stash.create();
    stash.print("ID=");
    stash.print(mak);
    Serial.println("\n\n\nPosting...\n");
    Serial.println(mak);
    digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(100);               // wait for a second
    digitalWrite(led, LOW);
    
    sensors.requestTemperatures();                // Initiate  temperature request to all devices
    String result;
    char msg[50];
    result=macstring+"\n";
    String temp;
    for (byte i=0; i < totalDevices; i++) {
      float tempC = sensors.getTempC(allAddress[i]);           // read the device at addr.
      if (tempC != -127.00)
      {
        //dtostrf(tempC,10,2,msg);
        stash.print("&");
        stash.print(DSstring[i]);
        stash.print("=");
        stash.print(tempC);
      }
    }
 
    int chk = sensor.read(DHT11PIN);
    if (chk==DHTLIB_OK)
    {     
          stash.print("&");
          stash.print(mak);
          stash.print("01");
          stash.print("=");
          stash.print(sensor.temperature);
          stash.print("&");
          stash.print(mak);
          stash.print("02");
          stash.print("=");
          stash.print(sensor.humidity);
          stash.print("&");
          stash.print(mak);
          stash.print("03");
          stash.print("=");
          stash.print(dav);
         
    }
    else
      switch (chk)
      {
        case DHTLIB_ERROR_CHECKSUM:
             Serial.println("Checksum error");
             break;
        case DHTLIB_ERROR_TIMEOUT:
             Serial.println("Time out error");
             break;
        default:
             Serial.println("Unknown error");
             break;
      }
    
    stash.save();
    // generate the header with payload - note that the stash size is used,
    // and that a "stash descriptor" is passed in as argument using "$H"
    Stash::prepare(PSTR("POST http://narodmon.ru/post.php HTTP/1.0" "\r\n"
                        "Host: narodmon.ru" "\r\n"
                        "Content-Length: $D" "\r\n"
                        "\r\n"
                        "$H"),
                  stash.size(), sd);
    // send the packet - this also releases all stash buffers once done
    ether.tcpSend();
    Serial.println("Done");
  }
}

Есть во всем этом один нюанс - если не хотите, чтобы все это Ваше устройство вышло из строя, то Вам необходимо Ethernet модуль запитать не от arduino pro mini, а от внешнего источника от которого вы запистали сам микроконтроллер. Потребление enc28j60 составляет 160mA в стандарте и аж 180 в максимуме, в то время как arduino может отдать через себя только 40мА.

Удачи в дальнейшем в Ваших проектах.

Да это естественно ведь 28j60 питается от 3.3в а не от 5 я лично делал переходник слава богу стабилизаторов 3.3. валом тут еще в другом проблема скетч автора блога прекрасно работает с плюсовой температурой и НИЧЕГО НЕ ЗНАЕТ об отрицательной температуре =))

Помогите разобраться с кодом отправки данных на народный мониториг. Совсем запутался.

Имею связку:

Arduino NANO v.3.0 + Enc28j60 + DHT22 +BMP085

Посути три типа даных: Темература(t), Влажность(h) и давление(pa).

Единствено у меня модуль Enc28j60 заточенный под Arduino NANO v.3 .0

Как сделать код отправики?

 

Дык а в чем проблема то скетч выше выложен замените DHT11 на DHT22 и будет вам счастье 

#include <Wire.h>
#include <BMP085.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EtherCard.h>
#include <dht11.h>
 
#define DHT11PIN 6
#define ONE_WIRE_BUS 2                             // Data wire is plugged into digital pin 3 on the Arduino
#define NumberOfDevices 8                          // Set maximum number of devices in order to dimension
#define led  13
#define REQUEST_RATE 300000 // milliseconds
BMP085 dps = BMP085();      // Digital Pressure Sensor 

long Temperature = 0, Pressure = 0, Altitude = 0, dav = 0;

static byte mac[] = { 0xD4, 0xCA, 0x6D, 0x53, 0x9D, 0x00 }; //В этой строке задайте свой MAC адрес
char mak[]="D4CA6D539D00";
static byte hisip[] = { 94,19,113,221 };//Здесь надо указать IP адрес сайта narodmon.ru
dht11 sensor;
OneWire oneWire(ONE_WIRE_BUS);                     // Setup a oneWire instance to communicate with any OneWire devices
DallasTemperature sensors(&oneWire);               // Pass our oneWire reference to Dallas Temperature.
byte allAddress [NumberOfDevices][8];              // Device Addresses are 8-element byte arrays.
                                                   // we need one for each of our DS18B20 sensors.
byte totalDevices;                                 // Declare variable to store number of One Wire devices
                                                   // that are actually discovered.
byte discoverOneWireDevices() {
  byte j=0;                                        // search for one wire devices and
                                                   // copy to device address arrays.
  while ((j < NumberOfDevices) && (oneWire.search(allAddress[j]))) {        
    j++;
  }
   return j                      ;                 // return total number of devices found.
}
String macstring;
String DSstring[NumberOfDevices];
byte Ethernet::buffer[700];
static long timer;
Stash stash;  

unsigned long time1=0;

void setup() {
  Serial.begin(57600);
   Wire.begin();
   delay(1000);
  dps.init();
  // note: use zeroCal only after initialization.
  // dps.zeroCal(101800, 0);    // set zero point
  if (ether.begin(sizeof Ethernet::buffer, mac, SS) == 0)
    Serial.println( "Failed to access Ethernet controller");
  if (!ether.dhcpSetup())
    Serial.println("DHCP failed");
    
  //overwrite DNS with google's if there are problems with DNS setup
  static byte dnsip[] = {8,8,8,8};
  ether.copyIp(ether.dnsip, dnsip);
 
  ether.printIp("My IP: ", ether.myip);
  ether.printIp("GW IP: ", ether.gwip);
  ether.printIp("DNS IP: ", ether.dnsip);
  ether.copyIp(ether.hisip, hisip);
  ether.printIp("Server: ", ether.hisip);
  while (ether.clientWaitingGw())
    ether.packetLoop(ether.packetReceive());
  Serial.println("Gateway found");
  macstring="";
  for(int k=0;k<sizeof(mac)/sizeof(byte);k++)
  {
        char msg[3];
        sprintf(msg,"%02X",mac[k]);
        //if (macstring!="#") macstring+="-";
        macstring+=msg;
  }
    
  pinMode(led, OUTPUT);
  sensors.begin();
  totalDevices = discoverOneWireDevices();
  for (byte i=0; i < totalDevices; i++)
  {
    DSstring[i]="";
    for(int k=7;k>=0;k--)
    {
          char msg[3];
          sprintf(msg,"%02X",allAddress[i][k]);
          DSstring[i]+=msg;
    };
   
    sensors.setResolution(allAddress[i], 10);      // and set the a to d conversion resolution of each.
  }
 
  timer = - REQUEST_RATE; // start timing out right away
}
void loop() {
 
  if (((millis() - time1)/1000.0) >= 1.0) {     
     dps.calcTrueTemperature();
     time1 = millis();      
  }
 
  dps.getPressure(&Pressure);
  dps.getAltitude(&Altitude);
  dav=Pressure/133.3224;
  ether.packetLoop(ether.packetReceive());
 
  if (millis() > timer + REQUEST_RATE)
  {
    timer = millis();
    byte sd = stash.create();
    stash.print("ID=");
    stash.print(mak);
    Serial.println("\n\n\nPosting...\n");
    Serial.println(mak);
    digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(100);               // wait for a second
    digitalWrite(led, LOW);
    
    sensors.requestTemperatures();                // Initiate  temperature request to all devices
    String result;
    char msg[50];
    result=macstring+"\n";
    String temp;
    for (byte i=0; i < totalDevices; i++) {
      float tempC = sensors.getTempC(allAddress[i]);           // read the device at addr.
      if (tempC != -127.00)
      {
        //dtostrf(tempC,10,2,msg);
       // stash.print("&");
       // stash.print(DSstring[i]);
       // stash.print("=");
       // stash.print(tempC);
      }
    }
 
    int chk = sensor.read(DHT11PIN);
    if (chk==DHTLIB_OK)
    {     
          stash.print("&");
          stash.print(mak);
          stash.print("01");
          stash.print("=");
          stash.print(sensor.temperature);
          stash.print("&");
          stash.print(mak);
          stash.print("02");
          stash.print("=");
          stash.print(sensor.humidity);
          stash.print("&");
          stash.print(mak);
          stash.print("03");
          stash.print("=");
          stash.print(dav);
          Serial.println(Pressure);
          Serial.println(dav);
    }
    else
      switch (chk)
      {
        case DHTLIB_ERROR_CHECKSUM:
             Serial.println("Checksum error");
             break;
        case DHTLIB_ERROR_TIMEOUT:
             Serial.println("Time out error");
             break;
        default:
             Serial.println("Unknown error");
             break;
      }
    
    stash.save();
    // generate the header with payload - note that the stash size is used,
    // and that a "stash descriptor" is passed in as argument using "$H"
    Stash::prepare(PSTR("POST http://narodmon.ru/post.php HTTP/1.0" "\r\n"
                        "Host: narodmon.ru" "\r\n"
                        "Content-Length: $D" "\r\n"
                        "\r\n"
                        "$H"),
                  stash.size(), sd);
    // send the packet - this also releases all stash buffers once done
    ether.tcpSend();
    Serial.println("Done");
  }
}

 

один момент интересный

led прописан на 13 pin и SCK ENC28J60 на нём же

Доброго времени суток. Повторил Вашу схему с незначительными изменениями.

На борту имеются DS18B20, BPM085, DHT22, ENC28j60, все это сведено на Arduino PRO mini. По отдельности каждый элемент работает, друг другу не мешают.

Воспользовался скетчем из предпоследнего комментария. Возникли вопросы:

1. При компиляции выдает ошибку 

In function 'void setup()':
 'class BMP085' has no member named 'init'

ругается на строчку   dps.init();

Как следствие

In function 'void loop()':
'class BMP085' has no member named 'calcTrueTemperature'
'class BMP085' has no member named 'getPressure'
'class BMP085' has no member named 'getAltitude'

Выложите, пожалуйста, библиотеку BMP085, которой Вы пользовались при создании. Две скачанные с github результат не изменили.

2. Закомментировал все, что касается барометра, компиляция прошла, но устройство даже не запросило адреса у моего DHCP сервера, следовательно не видно в сети и как следствие ничего не отправляет. Подскажите, пожайлуста, как присвоить адрес статически.

Заранее спасибо.

 

Добрый день. Это не мой код в комментарии. Либо у вас нет библиотеки BMP085, либо не та, что у автора комментария.

1) Библиотека подходит эта.

2) Использовать статический IP на ENC28j60 тоже пока не получилось, даже на примерах из библиотеки, все пишут что чип ENC28j60 очень глючной, не понятно, разбираюсь. 

Динамический IP получает нормально и работает с ним.

3) DHT22 c библиотекой от DHT11, работать не будет, нужна другая библиотека и нужно исправлять под нее код. 

Дык возьмите скетч автора блога он без bmp-085 залейте его если все работет добавьте сами что мешает так проверить?

Добавить комментарий