ENC28J60 и Arduino 100500 тема, т.к. сам так и не могу решить эту задачу.
- Войдите на сайт для отправки комментариев
Вс, 04/08/2013 - 18:32
Будь неладна карточка ENC28J60 и EtherCard.h о которой информации меньше, чем о вымерших мамонтах.
Есть код Arduino
#include <EtherCard.h> #include "DHT.h" #include <OneWire.h> #include <DallasTemperature.h> #include <EEPROM.h> // DHT 22 #define DHTPIN 3 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); float h, t; char H[6]; char T[6]; //DS18B20 #define ONE_WIRE_BUS 9 #define TEMPERATURE_PRECISION 9 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); float t1, t2; char T1[6]; char T2[6]; //Реле 4шт int Relay[4]; //EEPROM Уставки регулирования и сигналов аварий 1-в.темп.рег, 2-н.темп.рег, 3-в.пред.темп, 4-н.пред.темп, 5-в.пред.вл. int setpoint[5]; //Ethernet static byte mymac[] = {0x00, 0x04, 0xA3, 0x21, 0xCA, 0x38}; byte Ethernet::buffer[1024]; //временной интервал long previousMillis = 0; long interval = 10000; void setup () { Serial.begin(9600); dht.begin();//DHT22 sensors.begin(); //DS18B20 //Реле 4 шт. for (int i=4; i<8; i++) { Relay[i]=i; pinMode(Relay[i], OUTPUT); digitalWrite(Relay[i], LOW); } //EEPROM for (int i=0; i<6; i++) { setpoint[i] = EEPROM.read(i); } if (!ether.begin(sizeof Ethernet::buffer, mymac, 10)) Serial.println( "No"); else Serial.println("Ok"); if (!ether.dhcpSetup()) Serial.println("No"); else Serial.println("Ok"); ether.printIp("IP:\t", ether.myip); ether.printIp("Mask:\t", ether.mymask); ether.printIp("Host:\t", ether.gwip); Serial.println(); ether.hisport = 82; } void loop() { //Снятие показаний с датчиков //DHT22 unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { h = dht.readHumidity(); dtostrf(h, 5, 2, H); t = dht.readTemperature(); dtostrf(t, 5, 2, T); //DS18B20 sensors.requestTemperatures(); t1 = sensors.getTempCByIndex(0); delay (50); dtostrf(t1, 5, 2, T1); t2 = sensors.getTempCByIndex(1); delay (50); dtostrf(t2, 5, 2, T2); } //Ethernet word len = ether.packetReceive(); word pos = ether.packetLoop(len); if(pos) { BufferFiller bfill = ether.tcpOffset(); bfill.emit_p(PSTR("t$Feh$Feo$Fet$Fe"), T, H, T1, T2); ether.httpServerReply(bfill.position()); } }
В сериал все данные на всех уровнях выводятся красиво и правильно.
Код Processing
import processing.net.*; Client client; String ch; void setup() { client = new Client(this, "88.85.206.140", 82); delay(3000); } void draw() { client.write ("GET/Processing 2.0 "); delay (5000); while (client.available()>0){ ch = client.readString (); } println(ch); }
Который при запуске выдает в окно терминала
Client got end-of-stream. t„Ъ8fе»YЫ…g9єдXGҐыx&Дљe;Щ‡Zёж§щEЖ?z$ш¦D™З%{:d†Ш[з№ЊТ0nніQNт¬/q“НOуp.М’УЌo1ІмPЇсMОђr,m3СЏR°о2lЋРS п±р®L‘П-sК”v(«хIVґкi7Х‹W лµ6hЉФ•Л)wфЄHй·U€Ц4j+u—ЙJцЁt*И–K©ч¶и TЧ‰k5ehъ¤'y›Е„Ъ8fе»YЫ…g9єдXGҐыx&Дљe;Щ‡Zёж§щEЖ?z$ш¦D™З%{:d†Ш[з№ЊТ0nніQNт¬/q“НOуp.М’УЌo1ІмPЇсMОђr,m3СЏR°о2lЋРS п±р®L‘П-sК”v(«хIVґкi7Х‹W лµ6hЉФ•Л)wфЄHй·U€Ц4j+u—ЙJцЁt*И–K©ч¶и TЧ‰k5eo{:d†Ш[з№ЊТ0nніQNт¬/q“НOуp.М’УЌo1ІмPЇсMОђr,m3СЏR°о2lЋРS п±р®L‘П-sК”v(«хIVґкi7Х‹W лµ6hЉФ•Л)wфЄHй·U€Ц4j+u—ЙJцЁt*И–K©ч¶и TЧ‰k5etз№ЊТ0nніQNт¬/q“НOуp.М’УЌo1ІмPЇсMОђr,m3СЏR°о2lЋРS п±р®L‘П-sК”v(«хIVґкi7Х‹W лµ6hЉФ•Л)wфЄHй·U€Ц4j+u—ЙJцЁt*И–K©ч¶и TЧ‰k5e java.lang.NullPointerException at processing.net.Client.write(Unknown Source) at processing.net.Client.write(Unknown Source) at sketch_130804b.draw(sketch_130804b.java:36) at processing.core.PApplet.handleDraw(PApplet.java:2270) at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:243) at processing.core.PApplet.run(PApplet.java:2141) at java.lang.Thread.run(Thread.java:662)
Где, покажите мне, где я отправляю с ардуино в процессинг
t„Ъ8fе»YЫ…g9єдXGҐыx&Дљe;Щ‡Zёж§щEЖ?z$ш¦D™З%{:d†Ш[з№ЊТ0nніQNт¬/q“НOуp.М’УЌo1ІмPЇсMОђr,m3СЏR°о2lЋРS п±р®L‘П-sК”v(«хIVґкi7Х‹W лµ6hЉФ•Л)wфЄHй·U€Ц4j+u—ЙJцЁt*И–K©ч¶и TЧ‰k5ehъ¤'y›Е„Ъ8fе»YЫ…g9єдXGҐыx&Дљe;Щ‡Zёж§щEЖ?z$ш¦D™З%{:d†Ш[з№ЊТ0nніQNт¬/q“НOуp.М’УЌo1ІмPЇсMОђr,m3СЏR°о2lЋРS п±р®L‘П-sК”v(«хIVґкi7Х‹W лµ6hЉФ•Л)wфЄHй·U€Ц4j+u—ЙJцЁt*И–K©ч¶и TЧ‰k5eo{:d†Ш[з№ЊТ0nніQNт¬/q“НOуp.М’УЌo1ІмPЇсMОђr,m3СЏR°о2lЋРS п±р®L‘П-sК”v(«хIVґкi7Х‹W лµ6hЉФ•Л)wфЄHй·U€Ц4j+u—ЙJцЁt*И–K©ч¶и TЧ‰k5etз№ЊТ0nніQNт¬/q“НOуp.М’УЌo1ІмPЇсMОђr,m3СЏR°о2lЋРS п±р®L‘П-sК”v(«хIVґкi7Х‹W лµ6hЉФ•Л)wфЄHй·U€Ц4j+u—ЙJцЁt*И–K©ч¶и TЧ‰k5e
когда с ардуино уходит
bfill.emit_p(PSTR("t$Feh$Feo$Fet$Fe"), T, H, T1, T2);
где T, H, T1, T2 char[6] ?????
Укажите мне на ошибку или хотя бы на человеческий туториал для Ethercard, где были бы вменяемые примеры и объяснения для таких дубин как я. Мне просто надо передать около 10 float переменных и все...
Укажите мне на ошибку или хотя бы на человеческий туториал для Ethercard, где были бы вменяемые примеры и объяснения для таких дубин как я.
Мне вот интересно, с какого раза до Вас доходит информация? Я уже давно говорил: "уберите PSTR() из своего кода, раз не умеете им пользоваться". Отладьтесь сначала без этих выкрутасов хотя бы в части вывода переменных на web-страничку.
Карта тут не причем, enc28j60 - это кусок стеклотекстолита практически без мозгов, и все у него делается программным путем. Так что проблема - именно в программном коде.
В первую очередь у вас ошибка в методологии
Вы взяли "сразу все" (и сетевой, и процессинг, и датчики...) и пытаетесь это запустить.
Дробите задачу, получите "хоть что-то работающие", а потом это "что-то" подтягивайте зубами к нужному. На каждом шаге - изменяя/добавляя что-то одно...
Правильно сказал Andrey_Y_Ostanovsky, сделайтве вывод на web-страничку. Вначале - хотя-бы статичную. Долой процессинг, долой датчики...
Добейтесь что-бы в браузере могли набрать http://88.85.206.140:82 (кстати, зачем не стандартный порт? что-бы было больше возможностей где-то ошибится на начальном этапе?) и увидеть, скажем строку "Hello From Arduino"
Сейчас - вы не увидите. Потому что, как минимум, дело не только в ENC28J60, он отвечает за "передать данные", но.... сами-то данные должны быть в "правильно формате". Соотвествовать протоколу HTTP. То есть, "что должно быть посланно", можно подсмотреть (а еще лучше почитать про HTTP протокол) не только в примерах EtherCard, но и вообще любой библиотеки. Даже визнетовской. И там вы увидите, что вначале нужно сообщить клиенту "все хорошо, запрос мы обработали, счас будем слать данные"
Это пример из визнетовской библиотеки.
А вот пример из EtherCart
libraries\ethercard\examples\rbbb_server\rbbb_server.ino
Вот вначале выкидываем вот все эти h,m,s и . Отсылаем только строку "hello from arduino"
При этом, не забываем погуглить "коды состояний http" (что-бы понять, почему нужно было ответить именно 200 OK, а не скажем 400 OK", погуглить "заголовок Content-Type" и высянить какие значения он может принимать (это "намек", если мы планируем что у нас это будет читать не человек, а процессинг, возможно на нужен не html, а простой текст).
После этого, объявляем какие-нибудь переменные T, H, T1, T2, жестко, прямо в Setup назначаем им какие-нибудь значения. Скажем 1,2,3,4 и т.п. И делаем, по тому же принципе как в примере выше из h/m/s, что-то бы у нас сформировалась строка, скажем
"1,2,3,4" вместо "hello from arduino".
После того как мы увидили ее в браузере - пытаемся прочитать ее уже не браузером, а процессингом. Как строку. Просто "прочитать целиком и вывесити". Когда прочитали ее в процессинге - начинаем эту строку на части, и конвертировать в числовые переменные T,H,T1,T2 уже в процессинге (только обязательно при этом полазим на форуме. уже не раз обсужалось "как конвертировать число в строку". не пугатся если обсуждается это на примере Serial, а не Ethrnet. Суть разбора/конвертации строки от этого не меняется).
Вот... к этому моменту мы уже будем иметь "у нас есть какие-то переменные в ардуине, мы умеем их послать процессингу и там в процессенге тоже работать с ними как с числовывми переменными".
И вот только после этого, имеет смысл подрубать датчик читать в эти T,H,T1,T2 настоящие значения, прикручивать остальную логику и т.п.
Вообщем первый шаг: чуть-чуть почитать про HTTP протокол и получить хотя-бы "hello" от ардуины.
Эх, спасибо! стар я уже видимо для учебников... а с наскока, как много раньше, уже и не получается.
Эх, спасибо! стар я уже видимо для учебников... а с наскока, как много раньше, уже и не получается.
Стар и неспособен к обучению - две большие разницы. :) А с железками все достаточно просто: либо она не работает, либо должны выполняться тестовые примеры, обычно идущие с железкой. Дальше - можно допиливать _работающий_ пример.