(NRF24L01) кто сталкивался с такой проблемой
- Войдите на сайт для отправки комментариев
Ср, 24/09/2014 - 13:48
Данные передаются только при включении передатчика всего один раз. Насколько я понимаю они должны передаваться циклично
Код передатчика
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define CE_PIN 9
#define CSN_PIN 10
#include "DHT.h"
#define DHTTYPE DHT11
#define DHTPIN 2
DHT dht(DHTPIN, DHTTYPE);
const uint64_t pipe = 0xE8E8F0F0E1LL;
RF24 radio(CE_PIN, CSN_PIN);
int dannye[3];
void setup()
{
Serial.begin(9600);
dht.begin();
radio.begin();
radio.openWritingPipe(pipe);
}
void loop()
{
dannye[0]=dht.readHumidity();
dannye[1]=dht.readTemperature();
radio.write(dannye, sizeof(dannye) );
//Serial.print("Humidity :");
//Serial.println(dannye[0]);
// Serial.print("Temperature :");
// Serial.println(dannye[1]);
}
Код приемника
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define CE_PIN 9
#define CSN_PIN 10
const uint64_t pipe = 0xE8E8F0F0E1LL;
RF24 radio(CE_PIN, CSN_PIN);
int dannye[3];
void setup()
{
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(1,pipe);
radio.startListening();
Serial.print("Listening");
}
void loop()
{
if ( radio.available() )
{
bool done = false;
while (!done)
{
done = radio.read( dannye, sizeof(dannye) );
Serial.print("Humidity :");
Serial.println(dannye[0]);
Serial.print("Temperature :");
Serial.println(dannye[1]);
}
}
}
В сериале выдает:
Listening
Humidity : 36
Temperature :25
В вашем коде приемника ,после изменения значения переменной done на !false оно не меняет обратно свое значиние,и поэтому цикл while происходит всего 1 раз.
еще вот такая "безумная" идея :
в программе приемнике :
при 1-ом заходе в цикл loop() создаеться переменная bool done = false; в памяти она сидит под неким псевдонимом - допустим done'1.первый заход в цикл while,в теле которого done принимает значение !true и уже в следующий раз в цикл while не захдит.
при втором заходе в loop() опять инициализируеться bool done = false; но в этот раз она сидит в памяти под псевдонимом done'2.а поскольку условие цикла все еще работает с переменной done'1 то и условие цикла while выполняеться всего 1 раз.
Прошу прощения не совсем разбираюсь в этом. false изменить на true?
Попробуйте
void loop()
{
if ( radio.available() )
{
radio.read( dannye, sizeof(dannye) );
Serial.print("Humidity :");
Serial.println(dannye[0]);
Serial.print("Temperature :");
Serial.println(dannye[1]);
}
}
хорошо, попробую отпишусь. Спасибо за совет
vankenshtein, добавьте в код передатчика после отправки паузу 1 сек. Вряд ли вам нужна информация чаще.
или можно отправлять только если показания изменились.
странно. а у меня в машинке управление работает, а код почти один в один как у тс, только указываю размер массива не используя sizeof, ну и массив у меня не int
бла бла бла byte msg[3]; void setup(){ radio.begin(); radio.openReadingPipe(1,pipe); // Открываем один из 6-ти каналов приема radio.startListening(); // Начинаем слушать эфир myservo.attach(2); pinMode(dir, OUTPUT); pinMode(pwm, OUTPUT); } void loop(){ if (radio.available()){ bool done = false; while (!done){ done = radio.read(msg, 3); myservo.write(map(msg[0],0,180,71,131)); if(msg[2]==0){ digitalWrite(dir, msg[2]); analogWrite(pwm, msg[1]); } if(msg[2]==1){ digitalWrite(dir, msg[2]); analogWrite(pwm, 255-msg[1]); } } } }бла бла бла byte msg[3]; void setup() { radio.begin(); radio.setRetries(1,1); radio.openWritingPipe(pipe); // Открываем канал передачи Inicialize(1); Led_On; } void loop() { napr(); sped(); radio.write(msg, 3); }а разница в следующем
Обратите внимание, что sizeof возвращает общее количество байтов. Поэтому, при работе с массивами более объемных типов данных (такими, как int), цикл будет выглядеть примерно так. Кроме того, не забывайте, что правильно объявленная строка заканчивается нулевым символом с ASCII-кодом 0. ? for (i = 0; i < (sizeof(myInts)/sizeof(int)) - 1; i++) { // какие-либо операции с myInts[i] }у тс возвращается 6 а должно быть 3)) обращать надо внимание на типы данных
Попробуйте
void loop()
{
if ( radio.available() )
{
radio.read( dannye, sizeof(dannye) );
Serial.print("Humidity :");
Serial.println(dannye[0]);
Serial.print("Temperature :");
Serial.println(dannye[1]);
}
}
попробовал, к сожалению не помогло
паузу пробовал, не помогло. не могли бы вы помочь как сделать что б данные отправлялись только когда меняются
кому я написал. тс то пофиг))
простите я вас не понял, что такое тс?
топикстартер. человек открывший тему. ты короче
топикстартер. человек открывший тему. ты короче
что нужно поменять в коде? не могли бы вы подсказать
а ты читал мои посты?
вместо
надо
и можно заодно отказаться от sizeof и указывать размер массива, так как мы точно его знаем
спасибо большое, сейчас попробую
наоборот)) ты все перепутал
все сделал как я написал? массиву тип данных изменил?
код как был изначально все оставить также, только изменить тип данных еще
Передатчик
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #define CE_PIN 9 #define CSN_PIN 10 #include "DHT.h" #define DHTTYPE DHT11 #define DHTPIN 2 DHT dht(DHTPIN, DHTTYPE); const uint64_t pipe = 0xE8E8F0F0E1LL; RF24 radio(CE_PIN, CSN_PIN); byte dannye[3]; void setup() { Serial.begin(9600); dht.begin(); radio.begin(); radio.openWritingPipe(pipe); } void loop() { dannye[0]=dht.readHumidity(); dannye[1]=dht.readTemperature(); radio.write(dannye, 3 ); // Serial.print("Humidity :"); // Serial.println(dannye[0]); // Serial.print("Temperature :"); // Serial.println(dannye[1]); }Приемник
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #define CE_PIN 9 #define CSN_PIN 10 const uint64_t pipe = 0xE8E8F0F0E1LL; RF24 radio(CE_PIN, CSN_PIN); byte dannye[3]; void setup() { Serial.begin(9600); radio.begin(); radio.openReadingPipe(1,pipe); radio.startListening(); Serial.println("Listening....."); } void loop() { if ( radio.available() ) { bool done = false; while (!done) { done = radio.read( dannye, 3); Serial.print("Humidity :"); Serial.println(dannye[0]); Serial.print("Temperature :"); Serial.println(dannye[1]); } } }перепутал
read в приемник, write в передатчик, тип данных изменил
и все равно не работает?
данные приходят не один раз как было, а два раза и потом все.... тишина
убери все про dht, и просто в цикле отправляй данные. данные принимай и в uart отправляй
надо исключить возможные глючные элементы
если расскоментировать строки
// Serial.print("Humidity :"); 29 // Serial.println(dannye[0]); 30 // Serial.print("Temperature :"); 31 // Serial.println(dannye[1]);то в порте передатчика нормально выдает данные
я уже предложил что сделать чтобы выявить проблему
вы правы что то с dht
void loop() { dannye[0]=15; //dht.readHumidity(); dannye[1]=10; //dht.readTemperature(); radio.write(dannye, 3); }в приемнике сыпятся 10 и 15 все работает. Поискать другую библиотеку на dht?
я решил твою проблему и нашел еще в чем глюк. думаю дальше ты сам разберешься
не подскажете в приемнике или передатчике?
dht ))) там надо копать
передатчик
хорошо, спасибо большое за помощь. разберусь отпишу
убери все про радиомодуль и проверь отдельно dht, отсылай данные просто в uart
#include <SPI.h> //#include <nRF24L01.h> //#include <RF24.h> //#define CE_PIN 9 //#define CSN_PIN 10 #include "DHT.h" #define DHTTYPE DHT11 #define DHTPIN 2 DHT dht(DHTPIN, DHTTYPE); //const uint64_t pipe = 0xE8E8F0F0E1LL; //RF24 radio(CE_PIN, CSN_PIN); //byte dannye[3]; void setup() { Serial.begin(9600); dht.begin(); // radio.begin(); // radio.openWritingPipe(pipe); } void loop() { // dannye[0] byte h=dht.readHumidity(); // dannye[1] byte t=dht.readTemperature(); //radio.write(dannye, 3); Serial.print("Humidity:"); Serial.println(h); Serial.print("Temperature:"); Serial.println(t); }в сериале
Все работает нормально. В чем проблема?
не могу разобраться((
попробуй просто в передатчике добавить задержку ну например 1 секунду
void loop() { dannye[0]=dht.readHumidity(); dannye[1]=dht.readTemperature(); radio.write(dannye, 3 ); delay(1000); }а также ускорить uart
и постепенно убавляй задержку пока не определишь оптимально. на то чтобы отправить в uart тоже время ведь надо
а что за проблема была в dht?
так заработало или нет?
сейчас нету с собой ардуинок, завтра только
ну что ты за человек. арудина всегда должна быть с тобой, купи arduino micro, она размером меньше обычной флешки, и носи с собой
+10 к программированию ардуины сразу
хотя говорят лучше клизму с ардуиной сделать. не проверял, вот интересно кто бы проверил
но зато сразу +20 к программированию и +10 к харизме
))) и потом к проктологу
зачем практолог? есть же ардуино нано. берутся оттуда нано частицы и делается клизма
не изверги же. ладно там мини додумаются, а то вдруг кто додумается uno или mega запихать. нехорошо
но зато если посидишь на форуме поймешь кто как повышает свои навыки в программировании))
попробовал, не помогло(((
подключил барометр....... та же история(((
данные либо один раз, либо два раза приходят и все, может дело в библиотеке?
включаешь выключаешь приемник ничего не меняется. Включишь выключишь передатчик приходят данные
хз. получается дело только в передатчике
в приемнике так делал?
ога, не прокатило((
пока больше ничего в голову не приходит. либо дело в dht либе, либо может что то с типами данных
Помогли люди добрые))) Выложу может комуто пригодится
Передатчик:
#include <SPI.h> // библиотека для SPI интерфейса #include <RF24.h>// библиотека для беспроводного передатчика nRF24L01+ #include <RF24Network.h> #include "DHT.h" // библиотека для работы с датчиком температуры и влажности DHT DHT dht; // инициализация датчика DHT22 #define dnt_pin 4 float humidity; // влажность float temperature; // температура (в градусах цельсия) //////Подключение nRF24L01+///////////// /* Передатчик | arduino nano v3 1 Gnd | Gnd (минус) 2 Vcc | + 3.3 В (только 3.3!!!!) 3 CE | D9 4 CSN | D10 5 SCK | D13 6 MOSI | D11 7 MISO | D12 8 IRQ | в данной программе не используется */ #define CE 9 #define CSN 10 //////Инициализация и первичная настройка nRF24L01+////// RF24 radio(9, 10); RF24Network network(radio); const uint16_t this_node = 1; // Address of our node const uint16_t other_node = 0; // Address of the other node boolean query = false; // статус запроса на измерение температуры и влажности и передачу данных int serial_command; // команда, принятая через serial порт struct payload_t { float a; float b; }; void setup() { Serial.begin(9600); dht.setup(dnt_pin); // data pin 4 // вход для датчика DHT22 SPI.begin(); radio.begin(); //настройка nRF24L01+ network.begin(/*channel*/ 90, /*node address*/ this_node); } void read_sensor(){ //выполняем измерение температуры и влажности delay(dht.getMinimumSamplingPeriod()); temperature = dht.getTemperature(); humidity = dht.getHumidity(); Serial.println("read seansor"); Serial.print(temperature, 1); // 1 - количество знаков после запятой Serial.print(" \t"); // табуляция, отступ Serial.println(humidity, 1); } void loop() { read_sensor(); // Pump the network regularly network.update(); payload_t payload = {temperature, humidity}; RF24NetworkHeader header(/*to node*/ other_node); bool ok = network.write(header,&payload,sizeof(payload)); if (ok) Serial.println("ok."); else Serial.println("failed."); }Приемник:
#include <SPI.h> // библиотека для SPI интерфейса #include <RF24.h>// библиотека для беспроводного передатчика nRF24L01+ #include <RF24Network.h> //////Подключение nRF24L01+///////////// /* Передатчик | arduino nano v3 1 Gnd | Gnd (минус) 2 Vcc | + 3.3 В (только 3.3!!!!) 3 CE | D9 4 CSN | D10 5 SCK | D13 6 MOSI | D11 7 MISO | D12 8 IRQ | в данной программе не используется */ #define CE 9 #define CSN 10 //////Инициализация и первичная настройка nRF24L01+////// RF24 radio(9, 10); // Network uses that radio RF24Network network(radio); // Address of our node const uint16_t this_node = 0; // Address of the other node const uint16_t other_node = 1; //float humidity = 9999; // влажность //float temperature = 9999; // температура (в градусах цельсия) //int serial_command = 0; // Structure of our payload struct payload_t { float a; float b; }; void setup(){ Serial.begin(9600); SPI.begin(); radio.begin(); network.begin(/*channel*/ 90, /*node address*/ this_node); } void loop(){ // Pump the network regularly network.update(); // Is there anything ready for us? while ( network.available() ) { // If so, grab it and print it out RF24NetworkHeader header; payload_t payload; network.read(header,&payload,sizeof(payload)); Serial.print("Received ...."); Serial.print(" \t"); Serial.print(payload.a); Serial.print(" \t"); Serial.println(payload.b); } }Проверил, все работает
По поводу машинки, интересно) Какое железо стоит? какой регуль? можете весь скетч выложить?
Вот мой скетч на машинку.
Передатчик:
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #define CE_PIN 9 #define CSN_PIN 10 #define JOYSTICK_X A0 #define JOYSTICK_Y A1 #define JOYSTICK_Z A2 const uint64_t pipe = 0xE8E8F0F0E1LL; RF24 radio(CE_PIN, CSN_PIN); int joystick[4]; void setup() { Serial.begin(9600); radio.begin(); radio.openWritingPipe(pipe); pinMode(2, INPUT); digitalWrite(2, HIGH); } void loop() { joystick[0] = analogRead(JOYSTICK_X); joystick[0] = map(joystick[0],0,1023,180,1); joystick[1] = analogRead(JOYSTICK_Y); joystick[2] = analogRead(JOYSTICK_Z); joystick[2] = map(joystick[2],0,1023,130,50); joystick[3] = digitalRead(2); radio.write( joystick, sizeof(joystick) ); }Приемник:
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <Servo.h> Servo myservo; Servo myservo2; #define CE_PIN 9 #define CSN_PIN 10 int pwm = 0; const uint64_t pipe = 0xE8E8F0F0E1LL; RF24 radio(CE_PIN, CSN_PIN); int joystick[4]; #define LED_LIGHT 5 #define LED_PIN 3 #define LED_PIN1 2 #define INTERVAL 200UL void setup() { delay(1000); radio.begin(); radio.openReadingPipe(1,pipe); radio.startListening();; myservo.attach(4); myservo2.attach(8); pinMode (LED_PIN, OUTPUT); pinMode(LED_PIN1, OUTPUT); } void loop() { if ( radio.available() ) { bool done = false; while (!done) { done = radio.read( joystick, sizeof(joystick) ); myservo.write(joystick[0]); myservo2.write(joystick[2]); if(joystick[2]<85) { static unsigned long previousMillis = 0; if(millis() - previousMillis > INTERVAL) { // сохраняем время последнего переключения previousMillis = millis(); // меняем состояние выхода светодиода на противоположное текущему. // если горит - тушим, не горит - зажигаем. digitalWrite(LED_PIN,!digitalRead(LED_PIN)); } } else if (joystick[2]>95) { static unsigned long previousMillis = 0; if(millis() - previousMillis > INTERVAL) { // сохраняем время последнего переключения previousMillis = millis(); // меняем состояние выхода светодиода на противоположное текущему. // если горит - тушим, не горит - зажигаем. digitalWrite(LED_PIN1,!digitalRead(LED_PIN1)); } } else { digitalWrite(LED_PIN1, LOW); digitalWrite(LED_PIN, LOW); } digitalWrite(LED_LIGHT, !joystick[3]); } } }При повороте руля мигают поворотки, и фары включаются с кнопки)) Вместо регуля стоит электроника от сервы по этому слабовато гоняет(2 вольта всего выдает). Планирую собрать схемку на полевиках
Я бы не местое ТС сделал не массив, а структуру и передавал бы её по радио. И именовать поля удобно, и в индексах не запутаешься.
У меня тоже были проблемы с отправкой. Я указал минимальную скорость в 250 килобит и жестко забил канал передачи.
А sizeof() на то и нужна, чтобы байты не считать. :)
спасибо, понял, исправим