Ви не увійшли.
Сторінки 1
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
uint32_t message; // Эта переменная для сбора обратного сообщения от приемника;
void setup (){
radio.begin();
radio.enableAckPayload();
radio.openWritingPipe(pipe);
}
void loop(){
int command = 555; // Не суть - приемнику надо что-то передать, но это может быть и полезная информация;
radio.write( &command, sizeof(command) ); //Отправляем команду;
if ( radio.isAckPayloadAvailable() ) { // Ждем получения...
radio.read(&message,sizeof(message)); //... и имеем переменную message с числом 111 от приемника.
}
}
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"
RF24 radio(9,10); // Определяем рабочие ножки;
const uint64_t pipe = 0xE8E8F0F0E1LL; // Определяем адрес рабочей трубы;
void setup(){
radio.begin(); // Старт работы;
radio.enableAckPayload(); // Разрешение отправки нетипового ответа передатчику;
radio.openReadingPipe(1,pipe); // Открываем трубу и
radio.startListening(); //начинаем слушать;
}
void loop (){
uint32_t message = 111; //Вот какой потенциальной длины сообщение - uint32_t!
//туда можно затолкать значение температуры от датчика или еще что-то полезное.
radio.writeAckPayload( 1, &message, sizeof(message) ); // Грузим сообщение для автоотправки;
if ( radio.available() ) { //Просто читаем и очищаем буфер - при подтверждении приема
int dataIn; //передатчику приемник протолкнет ему в обратку наше сообщение;
bool done = false;
while (!done) {
done = radio.read( &dataIn, sizeof(dataIn)); // Значение dataIn в данном случае
//не важно. Но его можно использовать и как управляющую команду.
}
}
}
по библиотеке RF24 все последовательно и кропотливо делал по сообщениям ИгорьК вот с этого форума http://forum.amperka.ru/threads/nrf24l01-%D0%BF%D0%BE%D0%B1%D0%B5%D0%B6%D0%B4%D0%B0%D0%B5%D0%BC-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C.3205/
по библиотеке Mirf полностью взял код отсюда https://uscr.ru/podklyuchenie-radio-modulya-nrf24-k-arduino/
Доброго времени суток !! )) ищу помощь в организации обмена информацией по радиоканалу nRF24 . задача : сервер ардуино посылает команды на 4 клиента с подтверждением полученной информации . три дня бьюсь об монитор с форумами - не могу добиться никакой связи между двумя модулями nRF24.чувствую буду так же еще месяц страдать с тем же эффектом (( прошу помощи у тех кто работал с этими модулями и совсем не безвозмездно готов направить меня на путь истинный ! . с электроникой у меня проблем нет,с программированием тоже - проблема с поиском правильного пути решения этой проблемы и со временем ( не могу сутками пробовать разные варианты ,описываемые на форумах ) готов свои деньги поменять на ваш опыт работы с этими модулями )) в идеале хочу получить скетчи вида : сервер посылает команды на один из 4-х приемников с подтверждением от каждой посылки, а со стороны приемников - коды посылаемых команд . для заинтересовавшихся мне помочь - все вопросы и пожелания об ответной материальной помощи за данный труд на мыло sermokik@gmail.com или по телефону 0663940725 Спасибо всем откликнувшимся ))
Спасибо ! я так понял мне нужно купить SPI программатор и попробовать залить bootloader посредством ардуино ide !?!? . закажу сейчас .. пусть неспеша ко мне едет - полезная штука ,наверняка в жизни пригодится ! ))
Здравствуйте . Приехали мне с али четыре платки arduino pro mini atmega128 5v 16 . при подключении питания светится светодиод power и поргает с частотой примерно 1 Гц led 13 . это в общем то наверное нормально , но ... точно в такт с этим светодиодом меняются уровни на RX и TX. т.е. пока светодиод горит на них 1 , пока не горит на них 0 !!.в качестве связи для прошивки использую arduino nano в которой раньше сгорел проц, я его выпаял и с CH340 взял RX TX питание и DTR. все платы которые до этого у меня были без проблем через этот переходничек уровней связывались с компом . но вот эти которые приехали совсем никак не реагируют на подключение !!! просто как менялся уровень RX TX с частотой 1 гц так и меняется , на смотря на передачу запроса с компа,изменение DTR .. Если на ардуине нажать и удерживать RESET то светодиод led 13 гаснет , на rx tx появляются нули . я мог бы подумать что глючную платку мне китайцы прислали .. но все четыре ведут себя полностью одинаково !! наверняка есть что-то чего я не знаю (( посоветуйте что мне слелать и что это за прошивка заводская там залита ?? как мне залить свой скетч ??? Спасибо !! буду признателен за любые комментарии !!
vvr, всем стоять, работает программист ) ya_serega, осваивает Си после асма
ну и начал соответственно с jnc и иных goto ) пусть развлекается, вам жалко? он просто обязан пройти все велосипеды
угу , не пинайте меня слишком я же говорил что пока просто пробую различные варианты решения в данном случае конкретной задачи ( придуманной мной просто так - для ознакомления с языком ) . пока использую разные функции и операторы для решения одной и той же задачи , плавно переходя к построению алгоритмов программы . пока не сильно понимаю как можно организовывать циклы без условных и безусловных переходов (( наподобие
call метка
..
..
..
метка
..
..
цикл с условным переходом ( btfss бит
return )
..
..
goto метка
и чем while отличается от вышеописанной конструкции - ведь внутри можно написать кучу вариантов выхода из этого цикла а после узнать почему именно прошел break и дальше по if ... else организовать реакцию ? .. хотя наверное есть более простое решение ))))
ya_serega пише:Считает? А что считает? Перестает считать когда кнопка нажата?
эта програмка считает количество импульсов ( если точнее переходов с "0" в "1")
изначально на 12 выводе земля ( вывод обьявлен входом и соединен резистором 10 ком с землей что бы избежать Z состояния)
при каждом появлении "1" сount инкриминируется и я ничего не делая ожидаю "0" при его появлении начинаю всё сначала .. и так до бесконечности .Иначе как понимать Ваше:
{
pinMode(12, INPUT); //объявляем пин как вход - изначально он притянут резистором к земле и при нажатии на кнопку там появляется +5в
Serial.begin(9600);}
а этот вопрос я не понял - что я не правильно сделал в рамках моей задачи ? .. но я написал что всё уже заработало и указал в чем была моя ошибка )))
Ну что здесь не понятно? Вы написали что на входе сигналом должна быть лог. един. Вашем примере при отсутствии 1 программа влетает по LOW в первый while и плюсует count до те пор пока не появится 1 ( условие станет false). И что у Вас работает? Мало того что просто ОЧЕНЬ НЕ ПРАВИЛЬНО логически. Банальная лень ставить {} (или нет? А так задумано?) Что вообще не понятно где заканчивается первый while и что происходит дальше. Если "любитель" циклов дальше будет так писать то далеко не уйдет цикл он видите ли по сути "круг" .
где же здесь плюсуется по кругу ???
while ( digitalRead(12) == LOW ) ; //в цикле ничего не делаем пока не изменится состояние порта с "0" на "1"
здесь просто ожидаем 1
while ( digitalRead(12) == HIGH ) ; // ожидаем появление опять "0"
здесь просто ожидаем 0
count = count + 1; //инкриминируем счетчик
здесь один раз плюсанули
counttime = millis(); // запустили таймер
while ( digitalRead(12) == LOW ) { // ожидаем одно из условий выхода из цикла
здесь опять ожидаем 1 ))
а следующий плюс будет только при следующем импульсе !!!!! после данных трех циклов в count всего лиш 1 будет ...
ya_serega пише:Nefreemen пише:В рамках поставленных условий один путь ПРЕРЫВАНИЕ. Цикл while в loop() НЕ ПРАВИЛЬНО! А дальше как хотите, не хотите слышать флаг в руки и кило гвоздей в карман дабы ветром не сдуло (шутка). Удачи.
да не зацикливаюсь я на циклах .... а может и зацикливаюсь ..(( просто я пытаюсь с асм перейти на что-то попроще для моих задач.. а это попроще оказывается и не намного проще ..)) а в каких случаях тогда корректней можно использовать while ? .
спасибо ))) действительно самое правильное решение )) учить мат.часть )))
ya_serega. Ваш последний скетч говорит о том что Вы не понимаете одну очень важную вещь.
Процедура setup(){
здесь инициализация (назначение переменных) и всякой другой фигни, выполняется она ОДИН РАЗ перед стартом ОСНОВНОГО тела программы
}
loop(){
Основное тело программы выполняется постоянно. Это ЦИКЛ по СУТИ тот же while.
}
извините за дотошность - но вы подняли еще один мой вопрос - он как раз касается процедуры setup и назначения всяких переменных ))
вот он : если я переменные обьявляю до setup то всё нормально компилится а если в этом цикле то компилятор на них матюкается . что здесь я делаю не так ?
//int count = 0; // выделение памяти для переменной счетчика нажатий
//unsigned long counttime;
void setup() //процедура setup
{
int count = 0; // выделение памяти для переменной счетчика нажатий
unsigned long counttime;
pinMode(12, INPUT); //объявляем пин как вход
Serial.begin(9600);
}
вот кусок того что я ваяю .. две строчки
int count = 0; // выделение памяти для переменной счетчика нажатий
//unsigned long counttime;
я заремил над setup и перенес внутрь . до этого всё хорошо работало ,а если они внутри- компилятор не видит эти переменные в void loop() . почему ?
ya_serega. Ваш последний скетч говорит о том что Вы не понимаете одну очень важную вещь.
Процедура setup(){
здесь инициализация (назначение переменных) и всякой другой фигни, выполняется она ОДИН РАЗ перед стартом ОСНОВНОГО тела программы
}
loop(){
Основное тело программы выполняется постоянно. Это ЦИКЛ по СУТИ тот же while.
}Вашем примере получается:
loop(){
// здесь будут какие то
действия
Например Serial.print
прицепим еще один цикл
И войдем в него по условию
while( true){
ждем пока станет false при этом код который выше не выполняется, так и тот который ниже!
}
// здесь тоже команды}
Поэтому даже если Вы не хотите использовать прерывание то правильно будет проверять условие
loop(){
if (digitalRead(12) == HIGH){
count++
}
Serial.print(count);
}
Обращаю еще раз Ваше внимание что при использовании цикла while() высока вероятность "повесить" программу. При использовании этого цикла желательно использовать сторожевой таймер. Так как событие которое ожидает этот цикл может и вовсе не произойти.
да. я прекрасно это понимаю , спасибо еще раз )) wile не самый надежный оператор . но ваш пример мне немного не подходит - там пока на порту 1 count будет постоянно инкриминироваться пока не прийдет 0 . а мне нужно только 1 инкримент . наверное умнее в данном случае завести еще переменную в которой хранить предыдущее состояние пина и при его изменении с 0 в 1 делать один раз ++ ... но я же только учусь )) поэтому решил попробовать как работают все операторы и начал с самого простого )))) .. и еще в данной задаче если не будет на этом входе импульсов то и делать то больше программе нечего будет )))
всё что я нашел по процедурам это вот : http://arduino.ru/Reference/Void и http://arduino.ru/Reference/FunctionDeclaration
но я там не нашел ответ на мой вопрос ((
и я по вашему совету попробовал сделать то же самое только через прерывание- получилось )) спасибо )) но мне нечем больше занять процессор ,
да и не знаю куда потом я это буду использовать .. может на более важные вещи мне прерывания понадобятся ..) я
теперь пытаюсь понять как из этой програмки сделать отдельную циклическую функцию ..? если я ее описываю как int val () то она проходит один раз и всё - (( void она крутится и работает ... а если я ее описываю как void val() то компилятор начинает матюкаться на скобки внутри этой функции ((( .. и как потом вызывать эту функцию void () ?
вот до чего я доработал эту програмку и теперь не могу сделать из нее функцию что бы вызывать когда потребуется .
int count = 0; // выделение памяти для переменной счетчика нажатий
unsigned long counttime;
void setup() //процедура setup
{
pinMode(12, INPUT); //объявляем пин как вход
Serial.begin(9600);
}
void loop() //процедура loop
{ //начало
while ( digitalRead(12) == LOW ) ; //в цикле ничего не делаем пока не изменится состояние порта с "0" на "1"
while ( digitalRead(12) == HIGH ) ; // ожидаем появление опять "0"
count = count + 1; //инкриминируем счетчик
counttime = millis(); // запустили таймер
while ( digitalRead(12) == LOW ) { // ожидаем одно из условий выхода из цикла
if (millis() - counttime > 120)break; // либо появление "1" либо прошло времени больше чем 120 мс
}
if (millis() - counttime > 120) //если пауза было больше 120 то выводим счетчик в порт и обнуляем его
{ // Скобка начала условия if
Serial.println( count);
count = 0;
}// если время не прошло то просто переходим в начало
} //конец loop
Считает? А что считает? Перестает считать когда кнопка нажата?
эта програмка считает количество импульсов ( если точнее переходов с "0" в "1")
изначально на 12 выводе земля ( вывод обьявлен входом и соединен резистором 10 ком с землей что бы избежать Z состояния)
при каждом появлении "1" сount инкриминируется и я ничего не делая ожидаю "0" при его появлении начинаю всё сначала .. и так до бесконечности .
Иначе как понимать Ваше:
{
pinMode(12, INPUT); //объявляем пин как вход - изначально он притянут резистором к земле и при нажатии на кнопку там появляется +5в
Serial.begin(9600);
}
а этот вопрос я не понял - что я не правильно сделал в рамках моей задачи ? .. но я написал что всё уже заработало и указал в чем была моя ошибка )))
Спасибо большое )) я просто до прерываний еще не добрался - буду учить ))
а мой код я понял почему не работает : я опрашиваю кнопку только один раз перед циклом while и всё . А в цикле не опрашиваю - поэтому с чего же ему прерываться ? вот он навсегда и крутится .
вот так я сделал ))
int count=0; // выделение памяти для переменной счетчика нажатий
int val=0;// выделение памяти для переменной состояния порта
void setup() //процедура setup
{
pinMode(12, INPUT); //объявляем пин как вход
Serial.begin(9600);
}
void loop() //процедура loop
{
while ( digitalRead(12)==LOW ) ; //в цикле ничего не делаем пока не изменится состояние порта с "0" на "1"
count=count+1 ; //когда изменилось состояние инкриминируем счетчик
Serial.print( count); //выводим в порт
while ( digitalRead(12)==HIGH ) ; // ожидаем появление опять "0"
}
Здравствуйте .
Помогите пожалуйста понять основы. вторые сутки не получается считать количество нажатий кнопки .
или я не правильно понимаю операторы или не правильно работаю с переменными . или совсем ничего не понимаю
//#define p 12 // обьявляю константу для обращения к 12 пину - заремил
int count=0; // выделение памяти для переменной счетчика нажатий
int val=0;// выделение памяти для переменной состояния порта
void setup() //процедура setup
{
pinMode(12, INPUT); //объявляем пин как вход - изначально он притянут резистором к земле и при нажатии на кнопку там появляется +5в
Serial.begin(9600);
}
void loop() //процедура loop
{
val = digitalRead(12); //читаем данные с порта
while ( val==LOW ) count=count; //в цикле ничего не делаем пока не изменится состояние порта с "0" на "1"
count=count++ ; //когда изменилось состояние инкриминируем счетчик нажатий кнопки
Serial.print( count); //выводим в порт
while ( val==HIGH ) count=count; // ожидаем появление опять "0"
}
буду благодарен за любую помощь в разьяснении ))))))спасибо !
Сторінки 1