Энкодер с кнопкой

Тема в разделе "Arduino & Shields", создана пользователем prohor-nastya, 10 фев 2020.

Метки:
  1. prohor-nastya

    prohor-nastya Нерд

    добрый день!

    Подскажите пожалуйста про энкодер, как сделать, чтобы по нажатию, значения вращений писались в одну переменную, а по следующему нажатию в другую...

    задача отослать по радио значения для регулировки яркости на разных лентах светодиодных.

    или может подобный проект кто видел.

    заранее спасибо.
     
  2. делаешь переменную флаг и в условие... в условии если флаг == 1 обрабатываешь первую переменную, если флаг == 2, вторую и тд.
    кнопкой меняешь значение во флаге.
     
  3. prohor-nastya

    prohor-nastya Нерд

    Ой б...
    А я так и делал, только вместо == , написал =.
    И б.. думаю, почему не работает...
    Рука лицо.
     
  4. prohor-nastya

    prohor-nastya Нерд

    Друзья, посмотрите пожалуйста быдлокод
    все равно он у меня не работает...
    переменная С не хочет меняться, меняется, только когда кнопка нажата и тут же сбрасывается на 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]);



    }
     
  5. prohor-nastya

    prohor-nastya Нерд

    Переписал, но почему то 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]);

    }
     
     
  6. akl

    akl Гуру

    возможно ее надо сделать static или вообще глобальной.
    я так понял во втором скетче mode глобальная переменная вместо С и уже лучше работает.

    mode становится 3 потому что сначала идет mode++; потом Serial.println(mode); и только после этого mode = 1;
    соответевенно если mode==2, то в порт выведется что оно равно 3, а потом уже оно станет 1

    еще сомнительное место - там где
    if (mode == 1)
    ....
    else if (mode == 2)
    ....

    там надо поставить скобочки {} иначе оно может работать не так как задумано (хотя я и не очень понял как оно задумано, но лучше всегда после if() писать все что должно в нем выполняться в скобочках {...} во избежание.
     
    Daniil нравится это.
  7. prohor-nastya

    prohor-nastya Нерд

    СПАСИБО!