проблема с enc28j60+arduino

toc
Offline
Зарегистрирован: 09.02.2013

Sirocco пишет:

А как-то можно заставить работать Если одновременно добавить библиотеку  EthernetClient client; и EthernetServer server(80); то возникает конфликт и код не компилируется.

где текст ошибки?

Sirocco
Offline
Зарегистрирован: 28.09.2013
Sirocco
Offline
Зарегистрирован: 28.09.2013

Вобщем есть такой говнокод:

//--------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 минут отправлять эти данные. Но как её запустиь одновременно и в режиме клиента и в режиме сервера?

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

А те кто уже парсят не могут пихать в БД? Тут тема когда-то жила про клиент и сервер в одном флаконе - поищите.

Sirocco
Offline
Зарегистрирован: 28.09.2013

JollyBiber пишет:

А те кто уже парсят не могут пихать в БД? Тут тема когда-то жила про клиент и сервер в одном флаконе - поищите.

Пришлось поставить независимое устройство-мини сервер. А то пинг у этого шилда и так хуже некуда - 4-8сек. 

Вопрос: у коде который разместил выше проходит проверка датчиков температуры по серийнику. Один прогон всей проги - показания с одного датчика, второй - со второго... И так зависит от количества датчиков, будет 200 датчиков, через 200 циклов получим показания последнего. Можно с этим что-то сделать?

Времени, в принципе, достаточно. Неудобство в том, что выводятся они по очереди. Как описать, чтоб сначала эти датчики считались, а потом дальше прога выполнялась. У меня два датчика, грубо говоря нужно сделать так, чтоб часть скетча выполнилась два раза, а остальная чать один раз, и так по кругу. Как это замутить?

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Функцию написать или просто цикл.

Sirocco
Offline
Зарегистрирован: 28.09.2013

А как думаете, если взять три-четыре DS18B20, поставить рядом, и усреднить их показания, то теоритически точность повысится? У меня 5 датчиков есть. Два из них один в один показывают, остальные три показывают -/+ 0,06. Нашесть сотых разбег.

У трёх DTH22 разбег по влажности на 3%, по температуре на 1,2 градуса.

kazakoff
Offline
Зарегистрирован: 07.06.2013

Привет всем а как обстоят дела с UIPEthernet.h ? не зависает ли после 3-4 дней работы?

ansh
Offline
Зарегистрирован: 26.09.2014

Добрый день! Помогите разобраться в чем причина. Связка 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
  }


  
}

 

Bagunda
Offline
Зарегистрирован: 04.04.2012

Спасибо! Вы спасли мне жизнь! А то ничё не работало...

Оказывается надо обязательно указывать, чтобы использовало порт №10

Andrei250292
Offline
Зарегистрирован: 21.01.2017

Переписал: ether.browseUrl(PSTR("/cgi-bin/handler.py?"),"cxem=i_love_arduno", website, callback);

Не работает все равно