Приветствую! Прошу сильно не ругаться и больно не бить. Имею проблему... Собрал я погодную станцию 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(); } }
Вы хотите одновременно прицепить W5100 и ENC28J60? А почему нельзя обойтись одной из них? Попробуйте для начала запустить пример для ENC28J60, без других функций.
Нет-нет! Что Вы! Я хочу заменить W5100 на ENC28J60 и UNO на ProMini ради экономии конечного изделия. Примеры для ENC28J60 почти все заливал и запускал на UNO (из разных библиотек), но не все они корректно работают
Огромный минус ENC28j60 - необходимость крутить стек на контроллере. Попробуйте выбрать наиболее адекватный пример и заняться его отладкой. Можно сначала запустить только стек и постепенно навешивать на него функционал. Так будет проще отследить момент, когда все заглючит. Еще полезно при отладке использовать сниффер - WireShark очень рекомендую. На сниффере будет видно весь обмен по эзернету и можно будет проанализировать и содержимое пакетов, и времена.