Нет данных.
- Войдите на сайт для отправки комментариев
Тестирую слудующую связку:
радиоуправляемый выключатель (NRF24L01+)
трансивер Ethernet - NRF24L01+
Processing кнопка.
Выключатель работает, трансивер вроде как то же, а вот процессинг сигнал передает, но ответ что то не принимает.
Выкладываю все 3 скетча для анализа:
Выключатель:
#include <SPI.h> #include "RF24.h" RF24 radio(9, 10); const uint64_t pipes[2] = {0xF0F0F0F000LL, 0xF0F0F0F0FFLL}; // адреса каналов приема и передачи int i=0; int buttonstate = LOW; int buttonState = LOW; long interval = 500; long previousMillis = 0; void setup() { Serial.begin (9600); radio.begin(); radio.setDataRate(RF24_250KBPS); radio.setChannel(100); radio.setRetries(15,15); radio.openWritingPipe(pipes[0]); radio.openReadingPipe(1, pipes[1]); radio.startListening(); pinMode (3, OUTPUT); digitalWrite (3, LOW); pinMode(2, INPUT); } void loop () { if(radio.available()){ char data[7] = ""; radio.read(&data, 6); //RM[0-9][0-9][0-9][0-2] delay (50); if (data[0] == 'R' && data[1] == 'M' && data[2] =='0' && data[3] =='1' && data[4] =='1' && data[5] =='1') { Serial.println (data); buttonstate = digitalRead(2); High (); } else { if (data[0] == 'R' && data[1] == 'M' && data[2] =='0' && data[3] =='1' && data[4] =='1' && data[5] =='0') { Serial.println (data); buttonstate = digitalRead(2); Low (); } else { if (data[0] == 'R' && data[1] == 'M' && data[2] =='0' && data[3] =='1' && data[4] =='1' && data[5] =='2') { switch (i) { case 0: radio.stopListening(); radio.write(&"$RM0110>", 8); radio.startListening(); break; case 1: radio.stopListening(); radio.write(&"$RM0111>", 8); radio.startListening(); break; } Serial.println (data); } else { } } } } unsigned long currentMillis = millis(); if (currentMillis < previousMillis) {previousMillis = millis();} if(currentMillis - previousMillis > interval) { previousMillis = currentMillis; buttonState = digitalRead(2); if (buttonState != buttonstate) { buttonstate = digitalRead(2); switch (i) { case 0: High (); break; case 1: Low (); break; } } } }
Трансивер Ethernet - NRF24L01+
#include <SPI.h> #include "RF24.h" #include <Ethernet.h> RF24 radio(7, 8); byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xFE }; IPAddress ip(192,168,1,10); EthernetServer server(85); const uint64_t pipes[2] = {0xF0F0F0F000LL, 0xF0F0F0F0FFLL}; // адреса каналов приема и передачи char data[32] = ""; int n, k; void setup(){ Serial.begin(9600); Ethernet.begin(mac, ip); radio.begin(); radio.setDataRate(RF24_250KBPS); // Скорость передачи radio.setChannel(100); // Номер канала от 0 до 127 radio.setRetries(15,15); // Кол-во попыток и время между попытками radio.openWritingPipe(pipes[1]); // Открываем канал передачи radio.openReadingPipe(1, pipes[0]); // Открываем один из 6-ти каналов приема radio.startListening(); // Начинаем слушать эфир } void loop(){ EthernetClient client = server.available();//создаем сервер if (client){ //если сервер создан if(client.available()){ //если клиент подключен for (int i=0; i<32; i++) { data [i] = client.read (); //записываем информацию с интернета delay (10); if (data [i] == '>') { //если в ячеке записан > k = i; //запоминаем номер предыдущей ячейки } } for (int i=0; i<=k; i++) { Serial.print (data [i]); } Serial.println (); radio.stopListening(); radio.write(&data, k);//отправляем в эфир значение с radio.startListening(); } } if(radio.available()){ //если в эфире есть значение radio.read(&data, 32); //читаем его // Serial.println (data); if (data [0] == '$') { //если первый символ в полученных данных $ for (int i=1; i<32; i++) { if (data[i] == '>' //ищем конец данных ) { n=i+1; //записываем количесвто принятых данных } } /* for (int i=1; i<=n; i++) { Serial.print(data[i]); } */ Serial.println (); } else { //иначе, если первый символ не $, стираем все данные в data for (int i=0; i<32; i++) { data [i] = ' '; } } if (client) { //если есть сервер if (client.available()) { //если клиент подключен // for (int i=1; i<n; i++) { client.write(data); //отправляем данные в Ethernet Serial.print(data); // } Serial.println (); } for (int i=0; i<32; i++) { data [i] = ' '; //после того, как все отправили, стрираем data } } } }
import processing.net.*; Client client; PImage ON, OFF; String IP = "192.168.1.10"; int port = 85; boolean button = false; int mode = 0; void setup() { size(150, 150); client = new Client(this, IP, port); delay (1000); background(255); ON = loadImage("ON.png"); OFF = loadImage("OFF.png"); if (client != null) { client.write ("RM0110>"); } image (OFF, 11, 11); } void draw() { if (button == true) { //esli nagata mish if (client != null) { //esli podkluchenie udalos if (mode == 0) { // esli knopka bila vikluchena client.write ("RM0111>"); //otpravlaem komandu na vkluchenie } else { if (mode == 1) { // esli knopka bila vkluchena client.write ("RM0110>"); //otpravlaem komandu na vkluchenie } } } else { //inache if (client == null) { //esli podkluchitsa ne udaetsa background(255); textSize(32); text("No connect", 50, 80); //pechataem soobshenie ob oshibke } } button = false; } else { if (button == false) { //esli mish ne nagata if (client != null) { //esli podkluchenie udalos String data = client.readString(); if (data != null) { println (data); if (data == "RM0111") { mode = 1; background(255); image (ON, 11, 11); } else { if (data == "RM0110") { mode = 01; background(255); image (OFF, 11, 11); } else {} } } } else { if (client == null) { //esli podkluchitsa ne udaetsa background(255); textSize(32); text("No connect", 50, 80); //pechataem soobshenie ob oshibke } } } } } void mousePressed() { if (mouseX >= (11) && mouseX <= (139) && mouseY >= (11) && mouseY <= (139)) { button = true; } else { button = false; } }
Как должно работать:
Нажимаю "кнопку", процессинг отправляет условную команду на IP адрес сервера Arduino, тот в свою очередь принимает его, и без конвертаций кидает в эфир. Выключатель слушает эфир, как только там промелькнула знакомая команда, он совершает действие и отправляет ответ-подтверждение о том, что "да, я сделал это!". Трансивер читает эфир, видит "знакомые буквы", передает их в процессиг, ну а процессинг, увидев пришедшую команду меняет кнопку на результирующее положение.
Как получилось:
Нажал кнопку, трансивер принял - передал, лампочка загорелась (выключатель), выключатель передал ответ, трансивер его принял (100%, читал Serial порт), передает, но в процессинг приходят null.
Где беда? Или трансивер из ардуино и w5100 не передает, или же процессинг не принимает?
Хей! Все влюблены? да же тролл комента от Клапуция нет. 14 прошло, может ктони будь все же глянет тему?
1. в процессинге в 57 строке сделайте вывод на экран значения data.
2. в 45 строке readString - вы читаете, до того как ответ поступил. Добавьте проверку available http://www.processing.org/reference/libraries/net/Client_readString_.html
ваш метод draw запутан очень. Оставьте в начале одну проверку client как-то так if(client==null) { ... ; ... ; return;}
1. в процессинге в 57 строке сделайте вывод на экран значения data.
2. в 45 строке readString - вы читаете, до того как ответ поступил. Добавьте проверку available http://www.processing.org/reference/libraries/net/Client_readString_.html
]
спасибо, буду пробовать.
Проблема решена. Все дело в неправильных переменных.
неправильные - это какие? типа неправильного меда? :)
неправильные - это какие? типа неправильного меда? :)
Тупо, там где должны передаваться данные n, я пытался передать данные i переменной.
На данный момент в боевых условиях проходит испытание выключатель на NRF24L01, на который данные идут с Ethernet, через трансив модуль.
это клавиатура неправильная, а не переменные - ведь это она неправильно напечатала!