Погодная станция и ENC28J60

Тема в разделе "Проводная и беспроводная связь", создана пользователем makaroff, 14 июн 2014.

  1. makaroff

    makaroff Нуб

    Приветствую!
    Прошу сильно не ругаться и больно не бить. Имею проблему... Собрал я погодную станцию UNO + Ethernet W5100 + BMP180 + DHT11 + DS18b20 + LCD на I2C... И всё это прекрасно работает! Показания выводятся и на экранчик, и в порт, и даже страничка формируется с помощью Визнетовского Изернет Шилда. А вот с ENC28J60 подружить не удаётся :((. Т.е. сама то стейшен пашет и всё везде кажет, акромя интернета. Мож подскажете какую библиотеку использовать и что в коде поправить?
    Пробовал разные либры, больше всего понравилась библиотека UIPEthernet, но не пошло...

    Код (Text):
      // Подключаем библиотеки
     
      #include <Wire.h> // общение по I2C
     
      #include <LiquidCrystal_I2C.h>  // библиотека для LCD1602
      LiquidCrystal_I2C lcd(0x27,16,2);  // установка адреса экрана 0x27, 16 символов, 2 строки

      #include "DHT.h" // либа для DHT11 - датчика влажности и температуры

      #define DHTTYPE DHT11 // задаём тип датчика DHT
      #define DHTPIN A0 // сообщаем пин подключения DHT  
      DHT dht(DHTPIN, DHTTYPE);

      #include <Adafruit_BMP085.h> // либа для BMP085/BMP160 - датчика давления и температуры
      Adafruit_BMP085 bmp;
     
      #include <OneWire.h>// инициализация библиотеки шины OneWire
      #include <DallasTemperature.h>// инициализация библиотеки термодатчиков (здесь DS18B20)
      #define ONE_WIRE_BUS A1 // подключение цифрового DS вывода датчика к пину A1
      OneWire oneWire(ONE_WIRE_BUS); // запуск интерфейса OneWire для подключения OneWire устройств
      DallasTemperature sensors(&oneWire); // указание, что устройством oneWire является термодатчик от  Dallas Temperature
     
      #include <SPI.h>
      #include <Ethernet.h> // либа для Wiznet W5100
      byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // задаём mac-адрес...
      IPAddress ip(192,168,1,100); // и статический ip
      EthernetServer server(80); // а так же порт (c 80-м работает быстрее)
     
      void setup()
      {
        Serial.begin(9600); // задаём скорость работы порта 9600  
        Serial.println("Weather Station by makaroff"); // пишем в порт няшку ЧСВ ))
         
        lcd.init();  // инициализируем LCD
        lcd.backlight();  // включаем подсветку LCD
        lcd.setCursor(0, 0);
        lcd.print("Weather Station");
        lcd.setCursor(0, 1);
        lcd.print("by makaroff");
       
        delay (5000); // задержечка в 5 секунд
       
        lcd.clear();  // очищаем LCD
       
        dht.begin(); // запускаем DHT
        sensors.begin(); // запуск сенсоров DS
        bmp.begin(); // запускаем BMP
       
        Ethernet.begin(mac, ip); // запускаем Ethernet c указанием ip и mac
        server.begin(); // запускаем сервер
        Serial.print("IP address "); // сообщаем о запуске сервера по адресу...
        Serial.println(Ethernet.localIP()); // выводим локальный адрес сервера
        Serial.println(); // печатаем в порт пустую строку
      }
      void loop()
      {
        // работаем с BMP
        if (!bmp.begin()) // если BMP не запустился
          {
            Serial.println("Could not find a valid BMP160 sensor, check wiring!"); // пишем в порт, что BMP не найден
          }
          else // если всё норм, то...
          {
          // читаем и пишем температуру внутри корпуса в порт  
          // Serial.print("Temperature in case = ");
          // Serial.print(bmp.readTemperature());
          // Serial.println(" *C");
       
          // читаем и пишем в порт давлене в Паскалях
          // Serial.print("Pressure = ");
          // Serial.print(bmp.readPressure());
          // Serial.println(" Pa");
         
          // читаем и пишем в порт давлене в мм ртутного столба
          Serial.print("Pressure = ");
          Serial.print(bmp.readPressure()/133.33);
          Serial.println(" mm");
          }
       
        // работаем с DHT
        float h = dht.readHumidity(); // читаем влажность с DHT
        float t = dht.readTemperature(); // читаем температуру с DHT
        if (isnan(t) || isnan(h)) // если не можем считать из DHT t и h, то...
        {
          Serial.println("Could not find a valid DHT sensor, check wiring!"); // пишем это в порт
        }
        else // если всё норм, то...
        {
          // пишем влажность в комнате в порт
          Serial.print("Humidity in room = ");
          Serial.print(h);
          Serial.println(" %");
          // пишем температуру в комнате в порт
          Serial.print("Temperature in room = ");
          Serial.print(t);
          Serial.println(" *C");
        }
         
        // работаем с датчиками DS18B20
        sensors.requestTemperatures(); // команда опроса температуры DS
        Serial.print("Temperature outside = ");
        Serial.print(sensors.getTempCByIndex(0)); // печать в порт температуры ("0" в данном случае указывает на первое устройство на шине)
        Serial.println(" *C");  
        // Serial.print(sensors.getTempCByIndex(1)); // печать в порт температуры ("1" в данном случае указывает на второе устройство на шине)
        // Serial.println(" *C");
             
        Serial.println(); // печатаем в порт пустую строку
       
        //================== Работаем с LCD ==================
        //lcd.clear();
        //lcd.home();
        lcd.setCursor(0, 0);
        lcd.print("Pr.");
        lcd.print(bmp.readPressure()/133.33, 0);
        lcd.print("mm  ");
        lcd.setCursor(11, 0);
        lcd.print("H.");
        lcd.print(h, 0);
        lcd.print("% ");
        lcd.setCursor(0, 1);
        lcd.print("T.room");
        lcd.print(t  , 0);
        lcd.setCursor(9, 1);
        lcd.print("T.out");
        lcd.print(sensors.getTempCByIndex(0), 0);
         
         
        //================== 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>");
              {
              // поприветствуем
              client.println("Weather station by makaroff <br /><br />");
              // давлене в мм ртутного столба
              client.print("Pressure = ");
              client.print(bmp.readPressure()/133.33, 0);
              client.println(" mm <br />");
              // влажность в комнате
              client.print("Humidity in room = ");
              client.print(h, 0);
              client.println(" % <br />");
              // температура в комнате  
              client.print("Temperature in room = ");
              client.print(t, 0);
              client.println(" *C <br />");
              // температура за окном
              client.print("Temperature outside = ");
              client.print(sensors.getTempCByIndex(0), 0);
              client.println(" *C");    
              }
              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(1);
        // close the connection:
        client.stop();
        Serial.println("client disonnected");
        Serial.println();
        }
      }
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    Вы хотите одновременно прицепить W5100 и ENC28J60? А почему нельзя обойтись одной из них?
    Попробуйте для начала запустить пример для ENC28J60, без других функций.
     
  3. makaroff

    makaroff Нуб

    Нет-нет! Что Вы! Я хочу заменить W5100 на ENC28J60 и UNO на ProMini ради экономии конечного изделия.
    Примеры для ENC28J60 почти все заливал и запускал на UNO (из разных библиотек), но не все они корректно работают :(
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Огромный минус ENC28j60 - необходимость крутить стек на контроллере.
    Попробуйте выбрать наиболее адекватный пример и заняться его отладкой. Можно сначала запустить только стек и постепенно навешивать на него функционал. Так будет проще отследить момент, когда все заглючит. Еще полезно при отладке использовать сниффер - WireShark очень рекомендую. На сниффере будет видно весь обмен по эзернету и можно будет проанализировать и содержимое пакетов, и времена.