Действительно функция ожидания ввода или фикция? Никак не усмотрю обещанного.
- Войдите на сайт для отправки комментариев
Всем доброго времени суток, есть код известного блогера гайвера для управления 3-мя устройствами дистанционно посредством беспроводного модуля nrf24l01, в конце которого он делает интересную вставку, призванную сократить энергопотребление, а именно:
(Как вставлять код - читал, пишу с телефона, панель с кнопками не отображается)
/* Данный скетч делает следующее: передатчик (TX) отправляет массив
данных, который генерируется согласно показаниям с кнопки и с
двух потенциомтеров. Приёмник (RX) получает массив, и записывает
данные на реле, сервомашинку и генерирует ШИМ сигнал на транзистор.
by AlexGyver 2016
*/
#include
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
byte button = 3; // кнопка на 3 цифровом
byte potent = 0; // потенциометр на 0 аналоговом
byte slider = 1; // движковый потенциометр на 1 аналоговом пине
byte transmit_data[3]; // массив, хранящий передаваемые данные
byte latest_data[3]; // массив, хранящий последние переданные данные
boolean flag; // флажок отправки данных
void setup() {
Serial.begin(9600); //открываем порт для связи с ПК
pinMode(button, INPUT_PULLUP); // настроить пин кнопки
radio.begin(); //активировать модуль
radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток)
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(32); //размер пакета, в байтах
radio.openWritingPipe(address[0]); //мы - труба 0, открываем канал для передачи данных
radio.setChannel(0x60); //выбираем канал (в котором нет шумов!)
radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
//должна быть одинакова на приёмнике и передатчике!
//при самой низкой скорости имеем самую высокую чувствительность и дальность!!
radio.powerUp(); //начать работу
radio.stopListening(); //не слушаем радиоэфир, мы передатчик
}
void loop() {
transmit_data[0] = !digitalRead(button); // инвертированный (!) сигнал с кнопки
transmit_data[1] = map(analogRead(potent), 0, 1023, 0, 180); // получить значение
// в диапазоне 0..1023, перевести в 0..180, и записать на 1 место в массиве
transmit_data[2] = map(analogRead(slider), 0, 1023, 0, 255);
for (int i = 0; i < 3; i++) { // в цикле от 0 до числа каналов
if (transmit_data[i] != latest_data[i]) { // если есть изменения в transmit_data
flag = 1; // поднять флаг отправки по радио
latest_data[i] = transmit_data[i]; // запомнить последнее изменение
}
}
if (flag == 1) {
radio.powerUp(); // включить передатчик
radio.write(&transmit_data, sizeof(transmit_data)); // отправить по радио
flag = 0; //опустить флаг
radio.powerDown(); // выключить передатчик
}
}
Я не вижу тут именно обещанного ожидания в функции for. Я вижу тут некоторое понижение количества отправлений, благодаря непостоянному соответствию условия condition благодаря итерации i++.
Данную задумку хотел использовать в своем устройстве, но возникли сомнения. Прошу разъяснить прав ли я, а если нет, в чем я ошибаюсь. Спасибо.
вставка программного кода
Ну, так и идите с такими вопросами на ... форум известного блогера гайвера
Если читал, то вставляйте правильно. Не можете с телефона - вставляйте с телевизора, холодильника или чего-нибудь другого. В таком виде коды здесь не читают.
Нет
1. Пришли не на тот форум
2. Вставили код без номеров строк
Вот где логика? Гайвер код написал, а с вопросами сюда пришли. Он живой, вот и выносите моск ему.
Comoq -вы умудрились сделать просто все. чтоб разозлить местных старожилов :) Во-первых, зашли с телефона и неправильно вставили код. Во-вторых - притащили код Гайвера, имя которого на нашем форуме считается ругательным. И в третьих - плохо сформулировали вопрос, сколько не перечитывал ваш текст - так и не понял, о чем, собственно, вы спрашиваете.
вставка программного кода
Зайдите с телефона, и попробуйте вставить сами. У меня не было другой возможности.
Ну, так и идите с такими вопросами на ... форум известного блогера гайвера
Если читал, то вставляйте правильно. Не можете с телефона - вставляйте с телевизора, холодильника или чего-нибудь другого. В таком виде коды здесь не читают.
Нет
1. Пришли не на тот форум
2. Вставили код без номеров строк
У меня не было другой возможности вставить код, кроме как с телефона, там нет панели, гайвер не отвечает, куда я ему только не писал, решил что здесь помогут.
Зайдите с телефона, и попробуйте вставить сами. У меня не было другой возможности.
ну так зайдите НЕ С ТЕЛЕФОНА и вставьте еще раз. Если, конечно, вам интересно продолжить дискуссию.
Вот где логика? Гайвер код написал, а с вопросами сюда пришли. Он живой, вот и выносите моск ему.
Конечно, он же сразу ломанулся мне помогать, ведь кроме моих проблем его больше в жизни ничто не волнует, так??
Я везде писал, он не отвечает.
Comoq -вы умудрились сделать просто все. чтоб разозлить местных старожилов :) Во-первых, зашли с телефона и неправильно вставили код. Во-вторых - притащили код Гайвера, имя которого на нашем форуме считается ругательным. И в третьих - плохо сформулировали вопрос, сколько не перечитывал ваш текст - так и не понял, о чем, собственно, вы спрашиваете.
Ситуация такова: нигде не написано про отношение к гайверу - раз, про телефон тоже - 2 (раз все такие крутые, что же никто не додумался подружить сайт с мобильными устройствами?? Критиковать каждый может.) Я понадеялся на принципы уважения и справедливости, которые явно отсутствуют из-за синдрома вахтера. А вопрос был первый раз не понят за всё время опроса. Вот код как Вам нравится:
В итоге вопрос заново:
Конструкция
Должна ожидать изменения массива вводом данных пользователя с крутилки, кнопки или слайдера, и как увидит изменение - сразу поднимает флаг, по которому дальше код запускает передачу. Так вот формулировка у того-кого-нельзя-называть именно в ожидании, для энергосбережения, я не вижу тут ожидания. Была постоянная отправка, а эта конструкция просто на треть уменьшает эту постоянную отправку, 0.7(7) расходуемой мощности вместо 1.
Зайдите с телефона, и попробуйте вставить сами. У меня не было другой возможности.
ну так зайдите НЕ С ТЕЛЕФОНА и вставьте еще раз. Если, конечно, вам интересно продолжить дискуссию.
Сделал.
Comoq -вы умудрились сделать просто все. чтоб разозлить местных старожилов :) Во-первых, зашли с телефона и неправильно вставили код. Во-вторых - притащили код Гайвера, имя которого на нашем форуме считается ругательным. И в третьих - плохо сформулировали вопрос, сколько не перечитывал ваш текст - так и не понял, о чем, собственно, вы спрашиваете.
В качестве оффтопа подскажите, где я могу почитать, почему здесь так не любят александра майорова.
Так вот формулировка у того-кого-нельзя-называть именно в ожидании, для энергосбережения, я не вижу тут ожидания.
Вы не видите - а оно есть. Судя по коду, если данные не меняются - они вообще не передаются. И с чего вы решили, что уменьшение именно на треть? - если данные почти не меняются - уменьшение будет близким к 100%, если меняются постоянно - то вообще уменьшения не будет
В качестве оффтопа подскажите, где я могу почитать, почему здесь так не любят александра майорова.
зачем вам это? это сложный вопрос из разаряда общественной психологии :)
Вы не видите - а оно есть. И с чего вы решили, что уменьшение именно на треть? - в коде ничего похожего нет.
Судя по коду. если данные не меняются - они вообще не передаются.
Не вижу из-за сути счётчика for. Так как void loop прогоняет цикл постоянно, значит и i будет расти постоянно из-за i++, а так как у нас всего 3 "бита", то условие i < 3 будет выполняться периодически при переполнении переменной и отсчёта заново (про треть погорячился), вот и выходит, что отправка иногда, но будет выполняться и без команд пользователя.
зачем вам это? это сложный вопрос из разаряда общественной психологии :)
Для расширения кругозора, так как у меня тоже имеются кое-какая неприязнь. Можно одним предложением, кратко, я пойму в чём суть.
Ситуация такова: нигде не написано ... про телефон
А при чём тут телефон вообще? Написано про вставку кода. Код должен быть вставлен правильно, а с телефона Вы его вставляете или с холодильника - никого не волнует.
И это не прихоть. То, как Вы вставили код делает невозможным его обсуждение. Вас устроит ответ: исправьте ошибку в строке № ХЗ?
Так что, пришли на форум - соблюдайте его правила. Именно это и есть
почему здесь так не любят александра майорова.
http://arduino.ru/forum/programmirovanie/neskolko-interesnykh-i-poleznyk...
Но самое забавное, что если вообще ничего не передавать, то экономии скорее всего не будет - автор забыл занулить флаг в сетапе.
Не вижу из-за сути счётчика for. Так как void loop прогоняет цикл постоянно, значит и i будет расти постоянно из-за i++, а так как у нас всего 3 "бита", то условие i < 3 будет выполняться периодически при переполнении переменной и отсчёта заново (про треть погорячился), вот и выходит, что отправка иногда, но будет выполняться и без команд пользователя.
если честно, ничего не понял из абзаца выше.
Никакая "суть счетчика" там не влияет. Тут все предельно просто - отправка происходит только в том случае. если хотя бы один из 3х элементов массива изменился. Если ничего не менялось - ничего и не отправляется.
По гайверу - одним предложением - "средний по уровню программист с гонором на уровне Гейтса" :)
автор забыл занулить флаг в сетапе.
Никакая "суть счетчика" там не влияет. Тут все предельно просто - отправка происходит только в том случае. если хотя бы один из 3х элементов массива изменился. Если ничего не менялось - ничего и не отправляется.
Как Вы писали в теме про библиотеки гайвера - новичкам нужны эти мучения. Вот значит одно и моих: я не могу понять, как в этом примере for ожидает изменение массива, я разобрался в for, я понимаю как он работает, я даже конспект сделал по разным источникам, сам сделал пример скетча из него одного (бегущие числа с увеличением на 1 в мониторе порта), но не могу понять как оно работает в этом коде, именно в качестве ожидания, можете объяснить?
автор забыл занулить флаг в сетапе.
Так ведь он объявил её локальной, прямо в цикле for, а если объявлять глобальной как он про глобальные переменные говорит "это не нужно, можно запутаться".
Что происходит с переменной i когда мы ничего не трогаем? Разве она не растёт?
Но самое забавное, что если вообще ничего не передавать, то экономии скорее всего не будет - автор забыл занулить флаг в сетапе.
Вопрос снимается.
Так ведь он объявил её локальной, прямо в цикле for
вы о какой переменной? переменная flag - глобальная, определена в строке 16
я разобрался в for, я понимаю как он работает, я даже конспект сделал по разным источникам, сам сделал пример скетча из него одного (бегущие числа с увеличением на 1 в мониторе порта), но не могу понять как оно работает в этом коде, именно в качестве ожидания, можете объяснить?
Что происходит с переменной i когда мы ничего не трогаем? Разве она не растёт?
честно говоря. читается как "я выучил все буквы, прослушал 2х годичный курс языка и позанимался с преподавателем... но обьясните же мне, как все-таки читать?!!"
Я не понимаю. что в этих пяти строках может быть непонятно, особенно если даже "написал конспект" - и поэтому я не знаю, что обьяснять
Так ведь он объявил её локальной, прямо в цикле for
вы о какой переменной? переменная flag - глобальная, определена в строке 16
Увидел.
я не знаю, что обьяснять
Что происходит с переменной когда мы не трогаем управление, что происходит при записи одного из устройств ввода в массив, что творится в этой отдельной конструкции, во время её решения поднять флаг. Вот прям пошагово.
Я пытаюсь научиться, сухим текстом не получается, нужен опыт прошаренных.
Как Вы писали в теме про библиотеки гайвера - новичкам нужны эти мучения.
Новичкам-то да - нам за что они?
Новичкам-то да - нам за что они?
Это надо спросить у того, кто создал раздел для новичков. А если по сути - вопрос данной темы это не перебор вариантов, сам не дойду до понимания. Тут конкретный ступор, который надо разжевать, а кому разжёвывать кроме как знающим?
Ну, вот я вам "попроще" сделал, чтобы вы от своей i отстали:
Только учтите: дребезг кнопки тут не ампутируется, показания с переменных резисторов не сглаживаются - как и в "оригинальном" скетче. Т.е. они будут постоянно меняться в силу действия физических сил. А это с высокой вероятностью будет вести к постоянной передаче. Т.е. экономии тут можно вообще не обнаружить.
Это надо спросить у того, кто создал раздел для новичков. А если по сути - вопрос данной темы это не перебор вариантов, сам не дойду до понимания. Тут конкретный ступор, который надо разжевать, а кому разжёвывать кроме как знающим?
Короче - for здесь нужен чтобы упростить работу с массивами transmit_data[i] и latest_data[i]. Больше ни для чего.
Короче - for здесь нужен чтобы упростить работу с массивами transmit_data[i] и latest_data[i]. Больше ни для чего.
Ваш коллега говорит, что есть ожидание изменения массива и отправка при изменении, не могу вкурить как эта функция отслеживает изменение именно посредством ввода команд кнопки, слайдера и т.д.
Ну, вот я вам "попроще" сделал, чтобы вы от своей i отстали:
Стало ещё непонятнее...
Ну как, как... Сравнивается предыдущее состояние в latest_data и текущее в transmit_data. Если они не равны, то явно что-то изменилось.
Ваш коллега говорит, что есть ожидание изменения массива и отправка при изменении, не могу вкурить как эта функция отслеживает изменение именно посредством ввода команд кнопки, слайдера и т.д.
послушайте, вы что там курите?
Функция "посредством ввода кнопки" ничего не отслеживает. Что за бред? Функция тупо сравнивает новое и старое содержимое массива. Если новое содержимое такое же, как старое - ничего не отправляем, если содержимое изменилось - отсылаем. Что тут может быть непонятного?
Никакого "изменения кнопки или слайдера" в этой части кода нет и вообще не понятно, зачем о нем говорить
Ну как, как... Сравнивается предыдущее состояние в latest_data и текущее в transmit_data. Если они не равны, то явно что-то изменилось.
Воооот, а вот тут и кроется моё непонимание, как оно может не меняться, если из-за инкремента оно постоянно меняется даже при отсутствии команд пользователя?
Ну как, как... Сравнивается предыдущее состояние в latest_data и текущее в transmit_data. Если они не равны, то явно что-то изменилось.
пипец какой-то... "знал все буквы, не смог назвать слово"
Ну, вот я вам "попроще" сделал, чтобы вы от своей i отстали:
Стало ещё непонятнее...
Да божешь ты мой. Вот у вас в руках секундомер. Я даю вам задание сообщать мне об истечении каждой минуты. Вы как это будете делать?
Воооот, а вот тут и кроется моё непонимание, как оно может не меняться, если из-за инкремента оно постоянно меняется даже при отсутствии команд пользователя?
клиника... занавес.
Я пас
клиника... занавес.
Я пас
Я новичок, в разделе для новичков, Вы относитесь как к опытному, который не в себе. Никто не сказал ни слова строго по теме, все вокруг да около либо на другом примере, я прошу прояснить именно этот момент, такое ощущение, что никто не в состоянии этого сделать.
Да божешь ты мой. Вот у вас в руках секундомер. Я даю вам задание сообщать мне об истечении каждой минуты. Вы как это будете делать?
Каждые 60 секунд уведомлять Вас, только вопрос не в этом, а в том, где тут энергосбережение, если "секунды" капают хочу я того или нет, потому что у нас есть приращение i++ каждый новый цикл.
я прошу прояснить именно этот момент, такое ощущение, что никто не в состоянии этого сделать.
и вы правы - я к примеру, не в состоянии вам что-то обьяснить.
вам уже и цикл FOR вовсе из кода убрали - а у вас все еще какая-то переменная i где-то там прирастает и что-то меняет в данных
а у вас все еще какая-то переменная i где-то там прирастает и что-то меняет в данных
Пост №42 данной темы, надеюсь там я наконец объяснил, что мне не понятно. Это и только это непонятно, а не то, как проверяется изменение массива (я знаю, что сравнением).
потому что у нас есть приращение i++ каждый новый цикл.
и что из того??? (тут должен быть сарказм)
Какое отношение приращение i имеет к данным? разве мы переменную i отправляем??
Весело тут у вас!
ТС!, Дорогой, ты путаешь основной цикл loop() и этот мелкий for.
В этом for три строчки: при i = 0,1 и 2.
Заходя в loop и проведя все действия мы доходим до этого for . Он выполняется три раз для 0, 1 и 2, сравнивая элементы массива с этими номерами. Если хоть один отличается - взводим флаг на отправку.
Ты не психуй.... Скорее просто смешно получилось. У тебя в голове переклеились главный цикл и этот. Этот фор выполняется внутри ОДНОГО захода в луп, понял? ;)))) Садман41 тебе написал пример с выкинутым этим фор... делающий ровно то же самое.
Каждые 60 секунд уведомлять Вас, только вопрос не в этом, а в том, где тут энергосбережение, если "секунды" капают хочу я того или нет, потому что у нас есть приращение i++ каждый новый цикл.
1) Энергосбережение тут условное. Как и всё у Гайвера - оно как будто по тексту исходника есть, но на самом деле, в сущности - его нет. И каждому объяснять подобные финты мы уже заеб...
2) Давайте разберемся, что лично вы считаете энергосбережением. Не Гайвер, а лично вы.
Какое отношение приращение i имеет к данным? разве мы переменную i отправляем??
Нет, но она определяет равенство/неравенство массивов отправленного и того что нужно отправить, а из-за инкремента это неравенство иногда будет выполняться, так как при приращении перезаписанная i будет время от времени соотвествовать условию i < 3, значит и флаг будет подниматься.
Давайте разберемся, что лично вы считаете энергосбережением.
Я лично в этом коде считаю энергосбережением низкопотребляемый промежуток от выключения передатчика после опускания флага, и до его поднятия, иными словами промежуток, когда не осуществляется самое энергозатратное действие - передача.
2) Давайте разберемся, что лично вы считаете энергосбережением. Не Гайвер, а лично вы.
Гриш, наверно не стоит. Трезво оцени уровень спрашивающего - ты хочешь ему лекцию прочитать начиная с разницы междц битом и байтом?
Говоря по правде - идея сбережения тут есть. Она реализована через попу, как все у Гивера - но не этому... новичку разъяснять детали, если он сути вовсе не понимает