Как предотвратить попадание помех от Livewire/других датчиков в матрицу клавиатуры с одним аналоговым выводом (с использованием резисторов)?

Я видел учебник по соединению клавиатуры с помощью одного контакта с использованием нескольких резисторов: http://razibshahdat.blogspot.com/2018/05/one-single-analog-pin-keypad-control.html

У меня есть эта клавиатура, ЖК-дисплей 16x2, детектор движения PIR и датчик температуры и влажности DHT11. Кроме того, у меня есть дополнительный источник питания 5 В, подключенный к макету для дополнительного питания, хотя я не уверен, требуется ли это?

Все компоненты работают должным образом в текущей конфигурации только при загрузке соответствующего кода шаблона Arduino, за исключением клавиатуры. Клавиатура работала изначально, когда больше ничего не было подключено, но теперь значения сопротивления, подаваемые на последовательный, похоже, подскакивают, особенно в первом столбце. Я попытался добавить некоторое сопротивление между первым входом матрицы клавиатуры и проводом под напряжением, которое гасит колебания, но не устраняет их полностью. ![Schematic using Fritzing Я создал краткий скетч, чтобы попытаться сделать его немного проще для понимания, хотя я понимаю, что он все еще довольно хаотичен. Я новичок в Fritzing и Arduino и все еще разбираюсь во всем.

Вот изолированный код для клавиатуры, который я использую для поиска выходных значений (которые, как уже упоминалось, непредсказуемо меняются), хотя это работало ранее, при более простой настройке:

    // код, адаптированный из: https://www.youtube.com/watch?v=W8ZSeLD90KA
    void setup() {
         Serial.begin(9600);  /* Определение скорости передачи данных для последовательной связи */
    }
    
    void loop() {
      int keyIn;
      int keyVals [16] = {976, 450, 333, 244, 166, 138, 124, 109, 90, 81, 76, 70, 61, 57, 54, 51};
      char keys[16] = {'1','2','3','A','4','5','6','B','7','8','9','C','*','0','#','D'};
      int range = 1;
    
      keyIn = analogRead(A1);
    
      String temp = "";
    
      if (keyIn > 2)
      {
        Serial.print(keyIn);
        for(int i=0; i<=15; i++)
        {
          // Значения ключей изменились, поэтому закомментировано следующее
          //if (keyIn >= keyVals[i]-range && keyIn <= keyVals[i]+range)
          //{
          //  temp = keys[i];
          //}
        }
       Serial.print(temp);
       Serial.println("");
       delay(500);
    }

}

Наконец, я намерен, чтобы эта плата была мастером. Затем я намерен подключить ведомое устройство через I2C к двигателю постоянного тока, серводвигателю и светодиоду RGB. Кажется ли это возможным?

Пожалуйста, помогите, если можете.

Если у вас есть какие - либо дополнительные советы, которые тоже будут высоко оценены- заранее благодарю вас!

, 👍1

Обсуждение

у вас нет общего заземления между arduino и макетом, @jsotola

Уменьшите сопротивление, что уменьшит связанный шум после того, как вы убедитесь, что все заземления подключены. Есть и другие возможности, но завитая картинка для меня бесполезна., @Gil


1 ответ


Лучший ответ:

1

Вашими ключевыми ценностями являются:

int keyVals [16] = {976, 450, 333, 244, 166, 138, 124, 109, 90, 81, 76, 70, 61, 57, 54, 51};

Формула для значений ключей, приведенных в библиотеке OnewireKeypad, выглядит следующим образом:

float V = (voltage * float( R3 )) / (float(R3) + (float(R1) * float(R)) + (float(R2) * float(C)));
float Vfinal = V * ANALOG_FACTOR;

где:

  • напряжение = 5 В
  • R1 = 1000 Ом (три горизонтальных на схеме)
  • R2 = 4700 Ом
  • R3 = 1000 Ом (вывод на GND на схеме)
  • R = номер строки от 0 до 3
  • C = номер столбца от 0 до 3
  • ANALOG_FACTOR = 1023 / 5,0;

Схема клавиатуры, приведенная в статье на сайте, выглядит следующим образом:

Onewire keypad schematic

Я поместил формулу и параметры в электронную таблицу Excel и создал следующее:

Excel spreadsheet of Onewire formula

...что отличается от ваших ключевых ценностей.

Я неправильно понял вашу схему подключения? Ты делаешь что-то другое?

,

Спасибо вам за ваш подробный ответ, Тим! Это состояло из двух ошибок: одна заключалась в том, что моя земля не была подключена между Arduino и макетом, что уменьшало прыжки. Ваша рекомендация добавить сопротивление 1 Ком между заземлением и настройкой резистора клавиатуры была завершающим штрихом!, @user8788429