Схема подключения такая:
Сам сенсор – это кусок односторонней платы, к которому припаян проводок и сверху все заклеено скотчем.
Принцип работы
Схема - RC цепь.
Выдаем на PD7 единицу. И начинаем считать обороты цикла, в котором проверяется есть ли на PC0 единица. Количество оборотов цикла будет зависеть от емкости RC цепи. Чем больше емкость, то больше времени будет требоваться, чтобы достичь единицу на PC0.
Я использовал два резистора по 1 МОм. Если поставить еще больше сопротивление, то достижение 1 на PC0 еще замедлится. В моей схеме в состоянии покоя при 12Mhz надо около 50 оборотов цикла. При 1Mhz это может быть проблемой, а может и нет, но, факт, что если надо растянуть цикл замера, то можно просто увеличить сопротивление.
Если что-то преподнести или положить на сенсор, то емкость RC цепи увеличится. Если прикоснуться пальцем, то увеличится значительно, так как человек обладает емкостью примерно в 100pF и является проводником, а цепь сама по себе емкость раз в 10 меньше. Т.е. с человеком образуется вполне достойный конденсатор на сенсоре.
Схема в сборке
Видео работы
левое число на экране - количество оборотов цикла, право – просто счетчик, чтобы знать что ничего не остановилось и замеры продолжаются
Из видео может быть плохо видно, но факт, что чем сильнее давишь на пластинку, тем большее число оборотов цикла требуется для зарядки. Таким образом, такая система позволяет измерять, на сколько сильно давят на кнопку. Причем, как видно, числа довольно стабильные.
Интересно, что если убрать соединение между PD7 и PC0 вообще и просто ткнуть в PC0 сенсор, то наблюдается вот такая картина (программный код тот же):
Программа:
// input PC0 DDRC &=0b11111110; PORTC&=0b11111110; // pul up - off // output pd7 DDRD |=0b10000000; while(1){ k++; r=0; // counter // out 0 PORTD&=0b01111111; while(PINC&0b00000001); // out 1 PORTD|=0b10000000; while(!(PINC&0b00000001)) r++; // out 0 PORTD&=0b01111111; //output data to display /* itoa(r+2, buf,10); my44780_command_home(&disp1); my44780_send_string(&disp1,buf); my44780_send_string(&disp1," "); itoa(k, buf,10); my44780_send_string(&disp1,buf); my44780_send_string(&disp1," "); _delay_ms(100); */ }
В идеале же хотелось бы достичь работы только с одним проводом, чтобы с него конденсатор и заряжался и проверялся, чтобы экономить ноги МК.