добрый день! Подскажите пожалуйста про энкодер, как сделать, чтобы по нажатию, значения вращений писались в одну переменную, а по следующему нажатию в другую... задача отослать по радио значения для регулировки яркости на разных лентах светодиодных. или может подобный проект кто видел. заранее спасибо.
делаешь переменную флаг и в условие... в условии если флаг == 1 обрабатываешь первую переменную, если флаг == 2, вторую и тд. кнопкой меняешь значение во флаге.
Друзья, посмотрите пожалуйста быдлокод все равно он у меня не работает... переменная С не хочет меняться, меняется, только когда кнопка нажата и тут же сбрасывается на 0. Код (C++): /* Данный скетч делает следующее: передатчик (TX) отправляет массив * данных, который генерируется согласно показаниям с энкодера * . Приёмник (RX) получает массив, и записывает * данные на бегущий огонек (скорость бега), и генерирует ШИМ сигнал на транзистор (яркость). * * */ #define CLK 2 #define DT 3 #define SW 4 #include "GyverEncoder.h" #include <SPI.h> // библиотека для работы с шиной SPI #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"}; //возможные номера труб int a = 100 ; int b = 100; int encRotate = 100; byte transmit_data[2]; Encoder enc1(CLK, DT, SW, TYPE2); // для работы c кнопкой и сразу выбираем тип void setup() { Serial.begin(9600); //открываем порт для связи с ПК radio.begin(); //активировать модуль radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток) radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал radio.setPayloadSize(32); //размер пакета, в байтах radio.setCRCLength(RF24_CRC_16); radio.openWritingPipe(address[0]); //мы - труба 0, открываем канал для передачи данных radio.setChannel(115); //выбираем канал (в котором нет шумов!) radio.setPALevel ( RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! //при самой низкой скорости имеем самую высокую чувствительность и дальность!! radio.powerUp(); //начать работу radio.stopListening(); //не слушаем радиоэфир, мы передатчик } void loop() { enc1.tick(); int c =0; if (enc1.isPress()&&c==0) { c =1; Serial.println(c); Serial.println("isPress1"); } else if (enc1.isPress()&&(c==0||c==1)) { c=2; Serial.println(c); Serial.println("isPress2"); } else { c=0; Serial.println(c); Serial.println("isPress3"); } if (c== 0) { if (enc1.isRight()) { Serial.println("Right"); a = a+10;// если был поворот } if (enc1.isLeft()) { Serial.println("Left"); a = a-10;// если был поворот } } else if (c==1) { if (enc1.isRight()) { Serial.println("Right"); b = b+10;// если был поворот } if (enc1.isLeft()) { Serial.println("Left"); b = b-10;// если был поворот } } //transmit_data[0] = a; // transmit_data[1] = b; //radio.write(&transmit_data, sizeof(transmit_data)); Serial.print("a-----: "); Serial.println(a); Serial.print("b-----: "); Serial.println(b); //Serial.println(transmit_data[1]); }
Переписал, но почему то mode 2 или 3, хотя поставил ограничение не больше двух Код (C++): /* Данный скетч делает следующее: передатчик (TX) отправляет массив * данных, который генерируется согласно показаниям с энкодера * . Приёмник (RX) получает массив, и записывает * данные на бегущий огонек (скорость бега), и генерирует ШИМ сигнал на транзистор (яркость). */ #define CLK 2 #define DT 3 #define SW 4 #include "GyverEncoder.h" #include <SPI.h> // библиотека для работы с шиной SPI #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"}; //возможные номера труб int flag =0; int mode =1; int a = 100 ; int b = 100; byte transmit_data[2]; Encoder enc1(CLK, DT, SW, TYPE1); // для работы c кнопкой и сразу выбираем тип void setup() { Serial.begin(9600); //открываем порт для связи с ПК radio.begin(); //активировать модуль radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток) radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал radio.setPayloadSize(32); //размер пакета, в байтах radio.setCRCLength(RF24_CRC_16); radio.openWritingPipe(address[0]); //мы - труба 0, открываем канал для передачи данных radio.setChannel(115); //выбираем канал (в котором нет шумов!) radio.setPALevel ( RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! //при самой низкой скорости имеем самую высокую чувствительность и дальность!! radio.powerUp(); //начать работу radio.stopListening(); //не слушаем радиоэфир, мы передатчик } void loop() { enc1.tick(); if (enc1.isPress()== true && flag==0) { mode++; Serial.print("mode is ----"); Serial.println(mode); flag==1; if (mode>2) { mode = 1; } } if (enc1.isPress()== false && flag==1) { flag==0; } if (mode == 1) if (enc1.isRight()) { // Serial.println("Right"); a = a+10;// если был поворот //b = b+10;// если был поворот } if (enc1.isLeft()) { //Serial.println("Left"); a = a-10;// если был поворот //b = b-10;// если был поворот } else if (mode == 2) if (enc1.isRight()) { Serial.println("Right"); b = b+10;// если был поворот } if (enc1.isLeft()) { Serial.println("Left"); b = b-10;// если был поворот } //transmit_data[0] = a; // transmit_data[1] = b; //radio.write(&transmit_data, sizeof(transmit_data)); Serial.print("a-----: "); Serial.println(a); Serial.print("b-----: "); Serial.println(b); //Serial.println(transmit_data[1]); }
возможно ее надо сделать static или вообще глобальной. я так понял во втором скетче mode глобальная переменная вместо С и уже лучше работает. mode становится 3 потому что сначала идет mode++; потом Serial.println(mode); и только после этого mode = 1; соответевенно если mode==2, то в порт выведется что оно равно 3, а потом уже оно станет 1 еще сомнительное место - там где if (mode == 1) .... else if (mode == 2) .... там надо поставить скобочки {} иначе оно может работать не так как задумано (хотя я и не очень понял как оно задумано, но лучше всегда после if() писать все что должно в нем выполняться в скобочках {...} во избежание.