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, но и вообще любой библиотеки. Даже визнетовской. И там вы увидите, что вначале нужно сообщить клиенту "все хорошо, запрос мы обработали, счас будем слать данные"
client.println("HTTP/1.1 200 OK"); // все хорошо, запрос обработан client.println("Content-Type: text/html"); // ответь будет в html формате client.println(); // пустая строка. закончились заголовки, дальше - пойдут уже нашиЭто пример из визнетовской библиотеки.
А вот пример из EtherCart
libraries\ethercard\examples\rbbb_server\rbbb_server.ino
static word homePage() { long t = millis() / 1000; word h = t / 3600; byte m = (t / 60) % 60; byte s = t % 60; bfill = ether.tcpOffset(); bfill.emit_p(PSTR( "HTTP/1.0 200 OK\r\n" "Content-Type: text/html\r\n" "Pragma: no-cache\r\n" "\r\n" "<meta http-equiv='refresh' content='1'/>" "<title>RBBB server</title>" "<h1>$D$D:$D$D:$D$D</h1>"), h/10, h%10, m/10, m%10, s/10, s%10); return bfill.position(); }Вот вначале выкидываем вот все эти 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" от ардуины.
Эх, спасибо! стар я уже видимо для учебников... а с наскока, как много раньше, уже и не получается.
Эх, спасибо! стар я уже видимо для учебников... а с наскока, как много раньше, уже и не получается.
Стар и неспособен к обучению - две большие разницы. :) А с железками все достаточно просто: либо она не работает, либо должны выполняться тестовые примеры, обычно идущие с железкой. Дальше - можно допиливать _работающий_ пример.