Как предотвратить попадание помех от Livewire/других датчиков в матрицу клавиатуры с одним аналоговым выводом (с использованием резисторов)?
Я видел учебник по соединению клавиатуры с помощью одного контакта с использованием нескольких резисторов: http://razibshahdat.blogspot.com/2018/05/one-single-analog-pin-keypad-control.html
У меня есть эта клавиатура, ЖК-дисплей 16x2, детектор движения PIR и датчик температуры и влажности DHT11. Кроме того, у меня есть дополнительный источник питания 5 В, подключенный к макету для дополнительного питания, хотя я не уверен, требуется ли это?
Все компоненты работают должным образом в текущей конфигурации только при загрузке соответствующего кода шаблона Arduino, за исключением клавиатуры. Клавиатура работала изначально, когда больше ничего не было подключено, но теперь значения сопротивления, подаваемые на последовательный, похоже, подскакивают, особенно в первом столбце. Я попытался добавить некоторое сопротивление между первым входом матрицы клавиатуры и проводом под напряжением, которое гасит колебания, но не устраняет их полностью. Я создал краткий скетч, чтобы попытаться сделать его немного проще для понимания, хотя я понимаю, что он все еще довольно хаотичен. Я новичок в 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. Кажется ли это возможным?
Пожалуйста, помогите, если можете.
Если у вас есть какие - либо дополнительные советы, которые тоже будут высоко оценены- заранее благодарю вас!
@user8788429, 👍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;
Схема клавиатуры, приведенная в статье на сайте, выглядит следующим образом:
Я поместил формулу и параметры в электронную таблицу Excel и создал следующее:
...что отличается от ваших ключевых ценностей.
Я неправильно понял вашу схему подключения? Ты делаешь что-то другое?
Спасибо вам за ваш подробный ответ, Тим! Это состояло из двух ошибок: одна заключалась в том, что моя земля не была подключена между Arduino и макетом, что уменьшало прыжки. Ваша рекомендация добавить сопротивление 1 Ком между заземлением и настройкой резистора клавиатуры была завершающим штрихом!, @user8788429
- Подключение двух Arduino через I2C, когда контакты I2C A4/A5 уже используются.
- Чтение данных из eagle tree airspeed v3
- Датчик качества воздуха Sparkfun CCS811 не работает
- MAX30102 показывает частоту сердечных сокращений: 0.00 ударов в минуту / SpO2: 0%
- Датчики I2C не работают при подключении к LCD дисплею 20X04
- Измерения датчиков My Atlas Scientific дают нулевые значения при первом чтении
- Проблема стабильности кода прерываний, связанного с датчиком расхода
- DHT20 и дисплей Oled не работают вместе
у вас нет общего заземления между arduino и макетом, @jsotola
Уменьшите сопротивление, что уменьшит связанный шум после того, как вы убедитесь, что все заземления подключены. Есть и другие возможности, но завитая картинка для меня бесполезна., @Gil