Передача данных Ethernet Shield to Processing

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

Добрый день!

Подскажите, каким образом (команды) передавать и принимать данные с ардуины, подключенной к сети Ethernet, в Processing?

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

Это все замечательно, но я настолько глуп, что не могу понять, а где в процессинге указывать удаленный  IP, на который подцеплино ардуино. Может Вы могли бы мне выложить минипример с элементарной отправкой "Hello word" с UNO на комп в процессинг и из процессинга по наведению например курсора мыши в ардуино аналагичного текста?

 

Спасибо!

maksim
Offline
Зарегистрирован: 12.02.2012
import processing.net.*;

Client client;
String data;
boolean flag1 = false;
boolean flag2 = false;

void setup() 
{
  size(200, 200);
  client = new Client(this, "192.168.137.50", 80); // Connect to server on port 80
}

void draw() 
{
  background(255);
  if (mouseOverRect() == true) 
  {  
    fill(204);                    
    if (flag1 == false)
    {
      client.write('H');         
      flag1 = true;
      flag2 = false;
    }
  } else {                    
    fill(0); 
    if (flag2 == false)
    {
      client.write('L');  
      flag1 = false;      
      flag2 = true;
    }
  }
  rect(50, 50, 100, 100);        
}

boolean mouseOverRect() 
{
  return ((mouseX >= 50) && (mouseX <= 150) && (mouseY >= 50) && (mouseY <= 150));
}

 

#define LEDpin 4 // Set the pin to digital I/O 4
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,137,50);
EthernetServer server(80);

void setup() 
{
  Ethernet.begin(mac, ip);
  server.begin();
  pinMode(LEDpin, OUTPUT); // Set pin as OUTPUT
}

void loop() 
{
  EthernetClient client = server.available();
  if (client)
  {
    if(client.available())
    {
      char val = client.read();
      if (val == 'H') digitalWrite(LEDpin, HIGH);
      else digitalWrite (LEDpin, LOW);
      delay(100);
    }
  }
}

сделано из 2 стандартных примеров процессинга и дуины, обратку делаете по аналогии.

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

Спасибо! Вот тепреь понятно. Вы меня извините за дотошность, програмирование я в школе на уровне бейсика изучал, вот и не хватает знаний.

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

Все работает, всем спасибо!

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

Что не так?

Ардуино:

#include <SPI.h>
#include <Ethernet.h>
#include "DHT.h"

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,10);
EthernetServer server(82);
#define DHTPIN 2     
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

void setup() 
{
  Ethernet.begin(mac, ip);
  server.begin();
 Serial.begin(9600); 
  dht.begin();
}

void loop() 
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  
  EthernetClient client = server.available();
  
  client.println (h);
  Serial.println (h);
  }

Процессинг:

import processing.net.*;

Client client;
String data;
float h;

void setup() 
{
  size(100, 100);
  client = new Client(this, "192.168.1.10", 82); // Connect to server on port 80


}

void draw() 
{
 background(255, 255, 255); //цвет фона
 while (client.available()>0){
 h=client.read();
 delay(10);
 }
 fill (0);
 
 text(h, 15, 50);
  
  
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

Читайте про типы данных. Здесь на форуме есть куча тем на эту тему.

maksim
Offline
Зарегистрирован: 12.02.2012
#include <SPI.h>
#include <Ethernet.h>
#include "DHT.h"

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,10);
EthernetServer server(82);
#define DHTPIN 2     
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

void setup() 
{
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600); 
  dht.begin();
}

void loop() 
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  EthernetClient client = server.available();
  if (client) 
  {
    client.println(h, 2);
    Serial.println(h, 2);
  }
  delay(100);
}
import processing.net.*;

Client client;
String h = "";

void setup() 
{
  size(100, 100);
  client = new Client(this, "192.168.1.10", 82); // Connect to server on port 80
}

void draw() 
{
  background(255); //цвет фона
  if (client.available() > 0)
  {
    delay(50); // на всякий случай ,что бы данные успели передаться полностью
    h = "";
    while (client.available () > 0) h += client.read();
  }
  fill (0);
  textSize(30);
  textAlign(CENTER);
  text(h, 50, 60);
}

 

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

maksim пишет:

#include <SPI.h>
#include <Ethernet.h>
#include "DHT.h"

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,10);
EthernetServer server(82);
#define DHTPIN 2     
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

void setup() 
{
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600); 
  dht.begin();
}

void loop() 
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  EthernetClient client = server.available();
  if (client) 
  {
    client.println(h, 2);
    Serial.println(h, 2);
  }
  delay(100);
}
import processing.net.*;

Client client;
String h = "";

void setup() 
{
  size(100, 100);
  client = new Client(this, "192.168.1.10", 82); // Connect to server on port 80
}

void draw() 
{
  background(255); //цвет фона
  if (client.available() > 0)
  {
    delay(50); // на всякий случай ,что бы данные успели передаться полностью
    h = "";
    while (client.available () > 0) h += client.read();
  }
  fill (0);
  textSize(30);
  textAlign(CENTER);
  text(h, 50, 60);
}

 

 

После 14 строки (в процессинге) надо добавить например  

 client.write ("1");

для того , что бы ардуина поняла, что есть соединение со стороны. Иначе не работает.

 

Спасибо за красивую обработку данных, а то я сижу и ломаю голову, как мне это сделать ...

 

Вот только вопрос, а зачем в client.println (h, 2) цифра 2?

maksim
Offline
Зарегистрирован: 12.02.2012
  • print()

    Для вещественных (дробных) чисел второй параметр задает количество знаков после запятой. Пример:

    • Serial.println(1.23456, 0) выводит "1"
    • Serial.println(1.23456, 2) выводит "1.23"
    • Serial.println(1.23456, 4) выводит "1.2346"
ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Появилось время, решил продолжить тему. 

Что здесь не так?

import processing.net.*;

Client client;
String h = "";
String t = "";
String data = "";
int index = 0;


void setup() 
{
  size(700, 200);
  client = new Client(this, "192.168.1.10", 82); // Connect to server on port 80
}

void draw() 
{
  background(255); //цвет фона
  client.write ("1");
     
  fill (0);
  textSize(30);
  textAlign(CENTER);
  text(data, 350, 50);
  text(h, 350, 120);
  text(t, 350, 170);
}

void serialEvent (Client client)
{
 delay(50);
 data = client.readString ();
 while (client.available () > 0) data += client.read();

 
}
  

Думается, что serialEvent не будет работать с Ethernet соединением?

Как тогда мне обработать строку данных вида 55524649515055465155 ?

Цель, разбить всю эту строку на пары символов: 55, 52, 46 (точка) ... и т.д. при помощи index и в дальнейшем обработав эти пары сифр вывести на экран.

 

Спасибо!

Geronimo
Offline
Зарегистрирован: 06.05.2013

А кто вызывает serialEvent?

 

maksim
Offline
Зарегистрирован: 12.02.2012

Вы лучше опишите что хотите с данными и какими данными сделать.

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

maksim пишет:

Вы лучше опишите что хотите с данными и какими данными сделать.

 

Пока задача минимум:

Передача по Ethernet протаколу данных с датчиков (температура, влажность, давление), включение/выключение  розетки. Получение с SD карты суточных данных. 

Все это должно осуществляться в процессинг, думаю еще пароль ввести или разрешение к доступу только конкретных IP.

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

Прошу объяснит как разбить строку данных на отдельные значения....

maksim
Offline
Зарегистрирован: 12.02.2012

Для начала вам надо нормально прочитать строку - "55524649515055465155" - это вы не правльно прочитали строку ,она должна выглядеть 74.1327.37  . 

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

maksim пишет:

Для начала вам надо нормально прочитать строку - "55524649515055465155" - это вы не правльно прочитали строку ,она должна выглядеть 74.1327.37  . 

 

Пробовал, не получается. float процессинг не принимает.

maksim
Offline
Зарегистрирован: 12.02.2012

Ну как же, в виде строки принимает без проблем. Покажите код дуины.

maksim
Offline
Зарегистрирован: 12.02.2012
  if (client) 
  {
    client.write('t');
    client.print(t, 2);
    client.write(10);
    client.write('h');
    client.print(h, 2);
    client.write(10);
  }

 

import processing.net.*;

Client client;
String h = "";
String t = "";


void setup() 
{
  size(700, 200);
  client = new Client(this, "192.168.1.10", 82);
  delay(3000);
  client.write ("1");
}

void draw() 
{
  background(255); //цвет фона
  if (client.available () > 0)
  {
    char ch = client.readChar();
    if (ch == 't') t = client.readStringUntil(10);
    else
      if (ch == 'h') h = client.readStringUntil(10);
  }

  fill (0);
  textSize(30);
  textAlign(CENTER);
  text(h, 350, 120);
  text(t, 350, 170);
}

 

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

maksim пишет:

Ну как же, в виде строки принимает без проблем. Покажите код дуины.

#include <SPI.h>
#include <Ethernet.h>
#include "DHT.h"

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,10);
EthernetServer server(82);
#define DHTPIN 2     
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

void setup() 
{
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600); 
  dht.begin();
}

void loop() 
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  EthernetClient client = server.available();
  if (client) 
  {
   client.print(h,1);
    
   client.print(t,1);
   
   Serial.print("Ethernet conected ");
    
  } else { Serial.print("Ethernet disconected "); }
  
  delay(100);
   Serial.print("H ");
    Serial.print(h,1);
    Serial.print("% ");
    Serial.print("T ");
    Serial.print(t,1);
    Serial.print("C");
    Serial.println ();
}

 

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

maksim пишет:

  if (client) 
  {
    client.write('t');
    client.print(t, 2);
    client.write(10);
    client.write('h');
    client.print(h, 2);
    client.write(10);
  }

 

import processing.net.*;

Client client;
String h = "";
String t = "";


void setup() 
{
  size(700, 200);
  client = new Client(this, "192.168.1.10", 82);
  delay(3000);
  client.write ("1");
}

void draw() 
{
  background(255); //цвет фона
  if (client.available () > 0)
  {
    char ch = client.readChar();
    if (ch == 't') t = client.readStringUntil(10);
    else
      if (ch == 'h') h = client.readStringUntil(10);
  }

  fill (0);
  textSize(30);
  textAlign(CENTER);
  text(h, 350, 120);
  text(t, 350, 170);
}

 

 

Processing выдает ошибку NullPointerException

maksim
Offline
Зарегистрирован: 12.02.2012

У меня нормально компилируется.

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

maksim пишет:

У меня нормально компилируется.

 

Это уже после запуска. Секунд 5 работает, а потом выдает ошибку.

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

maksim пишет:

У меня нормально компилируется.

 

Есть возможность по гонять по дольше? максимум 10 секунд работает, а потом ошибка. Выделяет при выводе ошибки строку 


text(h, 350, 120);

 

maksim
Offline
Зарегистрирован: 12.02.2012
  if (h != null) text(h, 350, 120);
  if (t != null) text(t, 350, 170);

 

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

maksim пишет:

  if (h != null) text(h, 350, 120);
  if (t != null) text(t, 350, 170);

 

 

Блин, вот я тупой! Как  сам не догадался...

 

Спасибо!

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

Возвращаясь к нашим баранам:

Ардуино 

#include <OneWire.h>
#include <SPI.h>
#include <Ethernet.h>
#include "DHT.h"

String relay="";
int Relay=5;
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,10);
EthernetServer server(82);

#define DHTPIN 2     
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

#define DHTPIN 

void setup() 
{
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600); 
  dht.begin();
  pinMode(Relay, OUTPUT);
  pinMode(6, INPUT);
}

void loop() 
{
  float t = dht.readTemperature();
  float h = dht.readHumidity();
  
  if (t < 30) { 
    relay = "ON";
    digitalWrite (Relay, HIGH);
   } else {
  if (t > 32) { 
    relay = "OFF"; 
    digitalWrite (Relay, LOW);
  }
   }
       
  EthernetClient client = server.available();
  if (client) 
  {
    char data = client.read ();
    
    if (data == 't') { 
       client.write('t');
       client.print(t, 2);
       client.write(10);
       Serial.write('t');
       Serial.print(t, 2);
       Serial.write(10);
    }
    if (data == 'h') {
       client.write('h');
       client.print(h, 2);
       client.write(10);
       Serial.write('h');
       Serial.print(h, 2);
       Serial.write(10);
    }
    if (data == 'R') {
       client.write('r');
       client.print(relay);
       client.write(10);
       Serial.write('r');
       Serial.print(relay);
       Serial.write(10);
    }
   Serial.print("Ethernet connected ");
    
  } else { Serial.print("Ethernet disconnected "); 
  
  
   Serial.print("H ");
   Serial.print(h,2);
   Serial.print("% ");
   Serial.print("T ");
   Serial.print(t,2);
   Serial.print("C");
   Serial.print(" R:");
   Serial.print(relay);
   Serial.println ();
  }
}

Процессинг 

import processing.net.*;

Client client;
String h= "";
String t= "";
String r= "";


void setup() 
{
  size(300, 200);
  client = new Client(this, "88.85.206.140", 82);
  delay(3000);
  
}

void draw() 
{
  background(255); //цвет фона
 
    char ch = client.readChar();
    client.write ('t');
    delay (10);
    if (ch == 't'){ t = client.readStringUntil(10);}
    client.write ('h');
    delay (10);
    if (ch == 'h'){ h = client.readStringUntil(10);}
    client.write ('R');
    delay (10);
    if (ch == 'r'){ r = client.readStringUntil(10);}
  
 
  fill (128, 235, 238);
  textSize(50);
  text("Т:", 20, 40);
  text(t, 75, 40);
  text("С*", 225, 40);
  text("В:", 20, 90);
  text(h, 75, 90);
  text("%", 225, 90);
  text("R:", 20, 140);
  text(r, 75, 140);

  

}

Вроде все работает как надо, ошибки с NullPointer нет. Но, при нагреве руками датчика и потом при его есстественном остывании происходит расхождение показаний температуры, влажности и состояния реле между окном Processing и Serial Monitor ардуино. Процессинг как бы запаздывает, в течении 10 минут обратно показания не сошлись. В чем может быть дело?

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

К сожалению самостоятельно решить проблему так и не получается, прошу помочь!!!

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

Не знаю уже что делать, откуда копиться отставание?

 

maksim
Offline
Зарегистрирован: 12.02.2012

1. Зачем вы вообще сделали инициатором запроса процессинг?
2. А вы посчитайте сколько раз за один проход функции void draw() запрашиваете данные и сколько раз их читаете.
3. И посчитайте сколько раз в секунду вы запрашиваете данные.

Ответ на вопрос "откуда копиться отставание?" кроется во 2 пункте.

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

Уважаемый Максим!

Подскажи пожалуста, каким образом можно транслировать данные с ардуино на несколько запущенных клиентов процессинга? 

Сейчас, при запущенном одном клиенте, во втором пустота. Неужели данные необходимо дублировать столько раз, сколько планируется подключать клиентов?

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

Так же интересна одновременное транслирование данных в процессинг и в html, просто последовательное включение вывода данных в скетч результата не дает.

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

I need help!!!