Передача данных Ethernet Shield to Processing
- Войдите на сайт для отправки комментариев
Пнд, 03/06/2013 - 15:35
Добрый день!
Подскажите, каким образом (команды) передавать и принимать данные с ардуины, подключенной к сети Ethernet, в Processing?
https://processing.org/reference/libraries/net/Server.html
http://arduino.cc/en/Reference/ClientConstructor
https://processing.org/reference/libraries/net/Server.html
http://arduino.cc/en/Reference/ClientConstructor
Это все замечательно, но я настолько глуп, что не могу понять, а где в процессинге указывать удаленный IP, на который подцеплино ардуино. Может Вы могли бы мне выложить минипример с элементарной отправкой "Hello word" с UNO на комп в процессинг и из процессинга по наведению например курсора мыши в ардуино аналагичного текста?
Спасибо!
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 стандартных примеров процессинга и дуины, обратку делаете по аналогии.
Спасибо! Вот тепреь понятно. Вы меня извините за дотошность, програмирование я в школе на уровне бейсика изучал, вот и не хватает знаний.
Все работает, всем спасибо!
Что не так?
Ардуино:
#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); }Читайте про типы данных. Здесь на форуме есть куча тем на эту тему.
#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); }#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?
Для вещественных (дробных) чисел второй параметр задает количество знаков после запятой. Пример:
Появилось время, решил продолжить тему.
Что здесь не так?
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 и в дальнейшем обработав эти пары сифр вывести на экран.
Спасибо!
А кто вызывает serialEvent?
Вы лучше опишите что хотите с данными и какими данными сделать.
Вы лучше опишите что хотите с данными и какими данными сделать.
Пока задача минимум:
Передача по Ethernet протаколу данных с датчиков (температура, влажность, давление), включение/выключение розетки. Получение с SD карты суточных данных.
Все это должно осуществляться в процессинг, думаю еще пароль ввести или разрешение к доступу только конкретных IP.
Прошу объяснит как разбить строку данных на отдельные значения....
Для начала вам надо нормально прочитать строку - "55524649515055465155" - это вы не правльно прочитали строку ,она должна выглядеть 74.1327.37 .
Для начала вам надо нормально прочитать строку - "55524649515055465155" - это вы не правльно прочитали строку ,она должна выглядеть 74.1327.37 .
Пробовал, не получается. float процессинг не принимает.
Ну как же, в виде строки принимает без проблем. Покажите код дуины.
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); }Ну как же, в виде строки принимает без проблем. Покажите код дуины.
#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 (); }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
У меня нормально компилируется.
У меня нормально компилируется.
Это уже после запуска. Секунд 5 работает, а потом выдает ошибку.
У меня нормально компилируется.
Есть возможность по гонять по дольше? максимум 10 секунд работает, а потом ошибка. Выделяет при выводе ошибки строку
Блин, вот я тупой! Как сам не догадался...
Спасибо!
Возвращаясь к нашим баранам:
Ардуино
#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 минут обратно показания не сошлись. В чем может быть дело?
К сожалению самостоятельно решить проблему так и не получается, прошу помочь!!!
Не знаю уже что делать, откуда копиться отставание?
1. Зачем вы вообще сделали инициатором запроса процессинг?
2. А вы посчитайте сколько раз за один проход функции
voiddraw()запрашиваете данные и сколько раз их читаете.3. И посчитайте сколько раз в секунду вы запрашиваете данные.
Ответ на вопрос "откуда копиться отставание?" кроется во 2 пункте.
Уважаемый Максим!
Подскажи пожалуста, каким образом можно транслировать данные с ардуино на несколько запущенных клиентов процессинга?
Сейчас, при запущенном одном клиенте, во втором пустота. Неужели данные необходимо дублировать столько раз, сколько планируется подключать клиентов?
Так же интересна одновременное транслирование данных в процессинг и в html, просто последовательное включение вывода данных в скетч результата не дает.
I need help!!!