Нет данных.
- Войдите на сайт для отправки комментариев
Тестирую слудующую связку:
радиоуправляемый выключатель (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, через трансив модуль.
это клавиатура неправильная, а не переменные - ведь это она неправильно напечатала!