ENC28J60 и Arduino 100500 тема, т.к. сам так и не могу решить эту задачу.

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Будь неладна карточка 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 переменных и все...

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

ingener.solovyev пишет:

Укажите мне на ошибку или хотя бы на человеческий туториал для Ethercard, где были бы вменяемые примеры и объяснения для таких дубин как я.

Мне вот интересно, с какого раза до Вас доходит информация? Я уже давно говорил: "уберите PSTR() из своего кода, раз не умеете им пользоваться". Отладьтесь сначала без этих выкрутасов хотя бы в части вывода переменных на web-страничку.

Карта тут не причем, enc28j60 - это кусок стеклотекстолита практически без мозгов, и все у него делается программным путем. Так что проблема - именно в программном коде.

leshak
Offline
Зарегистрирован: 29.09.2011

В первую очередь у вас ошибка в методологии

Вы взяли "сразу все" (и сетевой, и процессинг, и датчики...) и пытаетесь это запустить.

Дробите задачу, получите "хоть что-то работающие", а потом это "что-то" подтягивайте зубами к нужному. На каждом шаге - изменяя/добавляя что-то одно...

Правильно сказал 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" от ардуины.

 

ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Эх, спасибо! стар я уже видимо для учебников... а с наскока, как много раньше, уже и не получается.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

ingener.solovyev пишет:

Эх, спасибо! стар я уже видимо для учебников... а с наскока, как много раньше, уже и не получается.

Стар и неспособен к обучению - две большие разницы. :) А с железками все достаточно просто: либо она не работает, либо должны выполняться тестовые примеры, обычно идущие с железкой. Дальше - можно допиливать _работающий_ пример.