Самодельная сенсорная кнопка вместо датчика уровня жидкости
- Войдите на сайт для отправки комментариев
Доброго времени суток! Решил сделать датчик уровень жидкости на базе самодельного сенсора, взял обычную скрепку скрутил ее спиралью припаял к ней резистор на 1МОм подключил к пину 7, другой контакт от спирали к питанию 5V. Задача стояла сделать массив датчиков для разных уровней, при чем датчик должен срабатывать и держит 1, когда сенсор фиксирует прикосновение и выдавать 0, когда его нет. Написал простой код для проверки работы и тут возникли вопросы - в подпрограмме в исходном коде все работает и выдает правильно, как только я убираю ненужные строчки 53,54,55,56 все сбивается и вместо постоянной 1 уже идет череда единиц и нулей, тоже самое происходит при проверке сенсора в основной программе. Помогите разобраться что делаю не так?!
[code]
int t;
int i = 0;
int j = 0;
int col1 = 0;
int row1 = 0;
int sen_arr[4][2] = {
{7, 0},
{23, 0},
{24, 0},
{25, 0}
};
void setup() {
Serial.begin (9600);
pinMode (13, OUTPUT);
}
void loop() {
sensor_data(sen_arr, row1);
//if (sen_arr[row1][1] == 0 ){
// Serial.println(sen_arr[row1][1]);
// } else {
// Serial.println(sen_arr[row1][1]);
// }
}
void sensor_data(int sen_arr[4][2], int row) {
t = 0;
pinMode (sen_arr[row][0], OUTPUT);
digitalWrite (sen_arr[row][0], LOW);
pinMode (sen_arr[row][0], INPUT);
delayMicroseconds(25);
while (!digitalRead (sen_arr[row][0])){
t++;
}
if (t == 0) {
i++;
if (i >= 3){
j = 0;
sen_arr[row][1] = 0;
//Serial.print("t = ");
//Serial.print(t);
//Serial.print(", i = ");
//Serial.print(i);
Serial.print(", sen_arr[row][1] = ");
Serial.println(sen_arr[row][1]);
digitalWrite (13, LOW);
}
} else {
j++;
if (j >= 3){
i = 0;
sen_arr[row][1] = 1;
Serial.print("t = ");
Serial.print(t);
Serial.print(", j = ");
Serial.print(j);
Serial.print(", sen_arr[row][1] = ");
Serial.println(sen_arr[row][1]);
digitalWrite (13, HIGH);
}
}
}
[/code]
А Вы не могли бы хоть немного прокомментировать код? И заодно, привести содержимое лога, который Вы печатаете? А то Ваши заявления, что "вместо постоянной 1 уже идет череда единиц и нулей" как-то повисают в воздухе. В каком месте оно идёт? Куда идёт?
Serial даёт задержку. Когда его убираешь - уходит и задержка.
[code] int t; int i = 0; int j = 0; int col1 = 0; int row1 = 0; int sen_arr[4][2] = { {7, 0}, // создаем массив датчиков {23, 0}, {24, 0}, {25, 0} }; void setup() { Serial.begin (9600); pinMode (13, OUTPUT); } void loop() { sensor_data(sen_arr, row1); //if (sen_arr[row1][1] == 0 ){ // Serial.println(sen_arr[row1][1]); // } else { // Serial.println(sen_arr[row1][1]); // } } void sensor_data(int sen_arr[4][2], int row) { t = 0; pinMode (sen_arr[row][0], OUTPUT);// digitalWrite (sen_arr[row][0], LOW); // устанавливаем ВЫХОД и 0 для замера времени разрядки кнопки pinMode (sen_arr[row][0], INPUT); // установливаем ВХОД замеряем время зарядки кнопки delayMicroseconds(25); // емкость кнопки можеть колебаться устанавливаем задержку для нормирования измерения не нажатой кнопки к 0 while (!digitalRead (sen_arr[row][0])){ t++; } if (t == 0) { // находим показания ненажатой кнопки i++; // считаем кол-во 0 if (i >= 3){ // т.к. могут быть колебания емкости кнопки, считаем кол-во 0 (ненажатой кнопки) не менее 3 подряд, тогда кнопка не нажата j = 0; // сбрасываем счетчик нажатой кнопки sen_arr[row][1] = 0; //Serial.print("t = "); //Serial.print(t); //Serial.print(", i = "); //Serial.print(i); Serial.print(", sen_arr[row][1] = "); Serial.println(sen_arr[row][1]); digitalWrite (13, LOW); } } else { j++; // считаем кол-во 1 if (j >= 3){// т.к. могут быть колебания емкости кнопки, считаем кол-во 1 (нажатой кнопки) не менее 3 подряд, тогда кнопка нажата i = 0;// сбрасываем счетчик ненажатой кнопки sen_arr[row][1] = 1; //Serial.print("t = "); //Serial.print(t); //Serial.print(", j = "); //Serial.print(j); Serial.print(", sen_arr[row][1] = "); Serial.println(sen_arr[row][1]); digitalWrite (13, HIGH); } } } [/code]Прокомментировал основное, логи по ссылке ("лог - правильно" - скетч в текущем виде, "лог - неправильно" - поставлен комментарий на 55-58). при изменениях в основной программе также идут изменения похожие на 2-й лог.
https://disk.yandex.ru/d/UN3MHgVvJHWIdA
понятно что связано с временными задержками, главный вопрос как сделать универсальный корректный код чтобы работа кнопки была по тех.заданию - нажата держит 1, отжата держит 0.
Jonotan75, вопрос конечно интересный. Но вот незадача. Как научить человека написать цифровой автомат, если объяснения занимают кучу времени. И нет гарантии что дойдет. Так что лучше с этим делом лучше завязать сразу.
void loop() { sensor_data(sen_arr, row1); }Не очень понятно, как оно работает, и так же переменная row...
void sensor_data(int sen_arr[4][2], int row) {Датчики, для отладки, лучше временно заменить на кнопки с фиксацией или выключатели
Не тема, а парад нелепостей, начиная с заголовка
Что у Вас в массиве sen_arr? Если верить строкам №№30-31, то номера пинов. Но тогда зачем Вы ему что-то присваиваете в строках №№ 41 и 54?
Что у Вас в массиве sen_arr? Если верить строкам №№30-31, то номера пинов. Но тогда зачем Вы ему что-то присваиваете в строках №№ 41 и 54?
судя по коду, массив sen_arr двумерный, в каждой строчке первый элемент - номер пина кнопки, второй - состояние этой кнопки.
согласен с BH, код - сплошная нелепость, начиная с описания переменных и заголовка функции
Вот еще вот это мне понравилось:
//if (sen_arr[row1][1] == 0 ){ // Serial.println(sen_arr[row1][1]); // } else { // Serial.println(sen_arr[row1][1]); // }проверяем переменную, если ноль - печатаем, а если нет... все равно печатаем!
"К чему эти метания. Маша?"
проверяем переменную, если ноль - печатаем, а если нет... все равно печатаем!
Почему Вы не допускаете, что человек - пофигист и так самовыражается?
На кнопки нельзя заменить, т.к. сенсор планируется использовать как датчик уровня, т.к. он реагирует на подъем воды и на спуск воды
Суть в чем скетч, проверить можно ли настроить сенсор как датчик уровня или нет, а принты для контроля и проверки. Проверка показала что задержки (выполнения команд) влияют на состояние сенсора. Готов выслушать дельные предложения по коду.
Не тема, а парад нелепостей, начиная с заголовка
Для каждого своя важная тема, у Вас есть недорогое решение датчика уровня минимум в двух положениях в одной емкости?
проверяем переменную, если ноль - печатаем, а если нет... все равно печатаем!
Почему Вы не допускаете, что человек - пофигист и так самовыражается?
Готов выслушать все включая критику) Но лучше дельные предложения по коду как настроить датчик!)
Что у Вас в массиве sen_arr? Если верить строкам №№30-31, то номера пинов. Но тогда зачем Вы ему что-то присваиваете в строках №№ 41 и 54?
Массив пинов и состояний на 4 датчика. Это фрагмент кода, хочу настроить один датчик.
А где схему такого сенсора взяли? Он вообще может корректно работать, от пальца? :-)
само собой, у вас проблема в тм, что не можете упорядочить свои мысли. Заголовок написан про одно, первое же предложение начинается про другое, схема описана так, что работать в принципе не может, скетч так вообще отдельная песня. Вы хоть с физ т.з. понимаете, как хотите что-то получить? Я вот думаю что ни фига не понимаете.
Но лучше дельные предложения по коду как настроить датчик!)
Блин, ну отвечайте же "дельно" на вопросы.
Я Вас спросил, что именно в этом массиве? А Вы мне что?
Массив пинов и состояний на 4 датчика. Это фрагмент кода, хочу настроить один датчик.
Объясните же толком, что именно в этом массиве?
Или это только мне нужно?
Но лучше дельные предложения по коду как настроить датчик!)
Блин, ну отвечайте же "дельно" на вопросы.
Я Вас спросил, что именно в этом массиве? А Вы мне что?
Массив пинов и состояний на 4 датчика. Это фрагмент кода, хочу настроить один датчик.
Объясните же толком, что именно в этом массиве?
Или это только мне нужно?
столбец 0 - пин датчиков, столбец 1 - состояние датчиков, по строкам 0-3 - четыре датчика, вроде все?
само собой, у вас проблема в тм, что не можете упорядочить свои мысли. Заголовок написан про одно, первое же предложение начинается про другое, схема описана так, что работать в принципе не может, скетч так вообще отдельная песня. Вы хоть с физ т.з. понимаете, как хотите что-то получить? Я вот думаю что ни фига не понимаете.
Разложу как вижу:
1) Касательно заголовка - чувствительность датчика будет увеличена, чтобы небыло прямого прикосновения? это конечная цель, 2) первое предложение - фиксация состояния как я понимаю не зависит от чувствительности если есть алгоритм, 3) по схеме - вот я и прошу определится - возможно это сделать, 4) скетч - набросок алгоритма который не идеален, коменты не убраны специально чтобы показать суть проблемы. Как-то так так что скажите по сути дела, как сделать правильно?!
А где схему такого сенсора взяли? Он вообще может корректно работать, от пальца? :-)
Схема обычная в инете есть, как кнопка работает идеально
Дожили, у народа на ТТР223 денег нет
То ли ещё будет.(
Как по мне, крутить в лупе с большой скоростью опрос датчиков не следует
void loop() { sensor_data(sen_arr, row1); }Лучше опрашивать их через определённые промежутки времени, к примеру
byte j = 0; unsigned long last_millis = 0; void read_sens(); void setup() { //........ } void read_sens(){ //............... } void loop() { if ((millis() - last_millis) >= 20) { // каждые 20мс опрашиваем last_millis = millis(); // новый датчик read_sens(); j++; // j - индекс датчика в массиве if (j > 3) j = 0; } }А где схему такого сенсора взяли? Он вообще может корректно работать, от пальца? :-)
Схема обычная в инете есть, как кнопка работает идеально
По словесному описанию исходного сообщения схема такая :-)
... взял обычную скрепку скрутил ее спиралью припаял к ней резистор на 1МОм подключил к пину 7, другой контакт от спирали к питанию 5V...
Или я упустил что?
Вопрос по коду из #3
В чём смысл цикла в строка №34-35. Что там делается? Генерируется случайное целое число в переменной t? Или что?
Дожили, у народа на ТТР223 денег нет
ТТР223 нормально работает как кнопка. Как датчик уровня - не получится, думал об этом.
При подаче питания у нее начинается процесс самокалибровки.
После самокалибровки переходит в режим выключено, даже если был прижат палец.
Хотел определять опускание воды ниже определенного уровня в пластиковой емкости, в автополивалке.
Дожили, у народа на ТТР223 денег нет
Проблема в том, что в ТТР223 нет удержания 1, т.е. есть триггер если соединить перемычку - при одном нажатии фиксирует 1, при повторном - убирает 1 на 0. т.е. речь темы использование сенсора как датчика уровня воды необходимо при наличии воды (читай нажатии) фиксировать 1, а при опускания уровня воды (читай отжатия) фиксировать 0. Если в обычном режиме при нажатии более 10сек. срывается уровень 1 до 0. Вот такая проблема с вашей кнопкой...
Вопрос по коду из #3
В чём смысл цикла в строка №34-35. Что там делается? Генерируется случайное целое число в переменной t? Или что?
Нашел в инете, видео мужик нормально принцип объясняет работы кнопки и скетча http://www.youtube.com/watch?v=5R0TVoSefwM
Как по мне, крутить в лупе с большой скоростью опрос датчиков не следует
void loop() { sensor_data(sen_arr, row1); }Лучше опрашивать их через определённые промежутки времени, к примеру
byte j = 0; unsigned long last_millis = 0; void read_sens(); void setup() { //........ } void read_sens(){ //............... } void loop() { if ((millis() - last_millis) >= 20) { // каждые 20мс опрашиваем last_millis = millis(); // новый датчик read_sens(); j++; // j - индекс датчика в массиве if (j > 3) j = 0; } }спасибо за предложение, основная проблема фиксить чистую 1 при нажатии и удержании и 0 при отжатии сенсора.. это сильно озадачивает как сделать... ( Скинул ролик может понятней будет.
основная проблема фиксить чистую 1 при нажатии и удержании и 0 при отжатии сенсора.. это сильно озадачивает как сделать... ( Скинул ролик может понятней будет.
Считать "тики" и , опытным путём , определить , что, например(условно) , меньше 5-бак пустой(0). больше 7- полный(1).
Середина - "серая зона" дребезг.
Ещё как вариант поискать другие датчики, т.к этот возможно будет работать нестабильно
И, кстати, вода - не палец, возможно ёмкость не увеличится, а, наоборот уменьшится, ещё от бака будет зависеть и ещё чего-нибудь...))
Возьми вот такой даччик и не тра... мосх. На моей бочке 2 сезона отстоял, грядёт третий. У меня только сверху стоИт, но ничего не мешает и в середину и в низ ёмкости врЕзаться
Вопрос по коду из #3
В чём смысл цикла в строка №34-35. Что там делается? Генерируется случайное целое число в переменной t? Или что?
Нашел в инете, видео мужик нормально принцип объясняет работы кнопки и скетча http://www.youtube.com/watch?v=5R0TVoSefwM
Простите, я не смотрю видео на ютубе (мне порнхаба хватает), Вы можете объяснить что делается в этих двух строчках Вашего (а не автора видео) кода? Генерируется случайное число? Или что?
увеличение входной емкости он там пытается фиксировать
если t==0 емкость исходная, если больше нуля - емкость увеличилась
увеличение входной емкости он там пытается фиксировать
если t==0 емкость исходная, если больше нуля - емкость увеличилась
Но там ведь может получиться любое число, в том числе и 0, и отрицательное, и какое угодно. Это же тупой цикл безо всяких задержек. За какое время переполнится int, станет отрицательным, а потом и снова нулём? На обычной 16МГц avr-дуине отрицательным оно станет через 160 миллисекунд, а нулём - через 320 миллисекунд! Это нормально для данной задачи? Я не знаю, может и нормально, но я пытаюсь, подвести ТС к понимаю этого момента, а он мне предлагает какие-то видосы. Они мне нужны, эти видосы? Зачем? Мне нужно что-то понять или самому ТС?
Возьми вот такой даччик и не тра... мосх. На моей бочке 2 сезона отстоял, грядёт третий. У меня только сверху стоИт, но ничего не мешает и в середину и в низ ёмкости врЕзаться
герконовый?
герконовый?
да
Дожили, у народа на ТТР223 денег нет
ТТР223 нормально работает как кнопка. Как датчик уровня - не получится, думал об этом.
При подаче питания у нее начинается процесс самокалибровки.
После самокалибровки переходит в режим выключено, даже если был прижат палец.
Хотел определять опускание воды ниже определенного уровня в пластиковой емкости, в автополивалке.
Чисто теоретически любое.
В предыдущих строках (30,31) был сброс емкости нулем, теперь пин читается как вход 32, а емкость заряжается через резистор 1М. Спустя некоторое время от момента сброса напряжение на входе достигнет половины питания и вместо нуля будет читаться единица. Она и останавливает цикл.
Фактически настраиваемый параметр это хреновины вот это время задержки
33delayMicroseconds(25);за это время напряжение должно дорасти до пол питания, если нет касания сенсора, тогда t =0.
А вообще этот аппаратно-программный сенсор успешен?
не проще так:?
Гермотрубка, герконы, резисторы, поплавок-кольцо-магнит.
Вообще его противопоказано применять в таком виде, из-за наличия такого фактора, как статическое электричество. Даже нормативы существуют о стойкости к статике при наличии электрических частей девайса доступных рукам.
Возьми вот такой даччик и не тра... мосх. На моей бочке 2 сезона отстоял, грядёт третий. У меня только сверху стоИт, но ничего не мешает и в середину и в низ ёмкости врЕзаться
герконовый?
Рассматривал это вариант, не очень практичен, т.к. громоздкий достаточно емкость есть одна небольшая и нужно отслеживать 2 уровня минимум и максимум, во-вторых нужна высокая точность речь идет о десятках граммов. И вообще хотелось что нибудь недорогое и универсальное - сенсор можно поставить через стенку на любой уровень, ничего резать не надо.
основная проблема фиксить чистую 1 при нажатии и удержании и 0 при отжатии сенсора.. это сильно озадачивает как сделать... ( Скинул ролик может понятней будет.
Считать "тики" и , опытным путём , определить , что, например(условно) , меньше 5-бак пустой(0). больше 7- полный(1).
Середина - "серая зона" дребезг.
Ещё как вариант поискать другие датчики, т.к этот возможно будет работать нестабильно
И, кстати, вода - не палец, возможно ёмкость не увеличится, а, наоборот уменьшится, ещё от бака будет зависеть и ещё чего-нибудь...))
ТТР223 нормально на воду реагирует, но недолго). Думаю вопрос только алгоритма и все заработает. Диапазон регистрации 1 или 0 параметром можно регулировать для гарантии. Можно по тикам по подробнее, какой-нибудь фрагмент кода применительно к ситуации.. буду экспериментировать)
Чисто теоретически любое.
В предыдущих строках (30,31) был сброс емкости нулем, теперь пин читается как вход 32, а емкость заряжается через резистор 1М. Спустя некоторое время от момента сброса напряжение на входе достигнет половины питания и вместо нуля будет читаться единица. Она и останавливает цикл.
Фактически настраиваемый параметр это хреновины вот это время задержки
33delayMicroseconds(25);за это время напряжение должно дорасти до пол питания, если нет касания сенсора, тогда t =0.
Все так и есть, спасибо) Минуса быть не может из-за задержки, только 0 и больше, я упростил для контроля ситуации - только 0 или 1
Для контроля уровня жидкости для радиопрозрачной емкости (Стекло или пластмасса)использую такой датчик из Китая:
У этого датчика нет самокалибровки в момент включения, как у TTP223. В этом конкретном датчике имеется выход-открытый коллектор.Использую такой датчик в схеме с Attiny85 для контроля уровня тосола в авто.Работает очень хорошо, и зимой и летом.
Можно по тикам по подробнее, какой-нибудь фрагмент кода применительно к ситуации.. буду экспериментировать)
bool LEVEL_0 = false; // флаг состояния 0-го датчика void sensor_data() { tik = 0; pinMode (sen_arr[j], OUTPUT);// digitalWrite (sen_arr[j], LOW); // устанавливаем ВЫХОД и 0 для замера времени разрядки кнопки pinMode (sen_arr[j], INPUT); // установливаем ВХОД замеряем время зарядки кнопки // delayMicroseconds(25); // while (!digitalRead(sen_arr[j]) { //пока не будет лог1, считаем tik-и tik++; } Serial.println(tik); //считаем tik-и с пустым баком , и с полным и на delay(1000); //основе замеров пишем условие, что-то вроде: if (tik < 5) LEVEL_0 = false; if (tik > 7) LEVEL_0 = true; }delay только для упрощения примера, лучше millis
Рассматривал это вариант, не очень практичен, т.к. громоздкий достаточно емкость есть одна небольшая и нужно отслеживать 2 уровня минимум и максимум, во-вторых нужна высокая точность речь идет о десятках граммов. И вообще хотелось что нибудь недорогое и универсальное - сенсор можно поставить через стенку на любой уровень, ничего резать не надо.
Осталось только услышать, что эти десятки граммов нужно ловить на тонне жидкости, а жидкость эта - расплавленный чугун! Шутка, если что. Но есть сомнения, тот ли Вы метод измерения осваиваете...
Вернемся к поставленному вопросу, чтобы оценить реалистичность алгоритма.
Для RC цепочки время заряда до пол питания определяется формулой 0,69*RC, и где R =1 МОм,
подставив в нее граничные значения 25 мкс и 160 мс и рассчитав емкость получим, что
емкость самого контакта должна быть не более 36 пф, а максимальная емкость не более 200 нФ.
200 нФ это очень большая емкость для уединенного тела. По определению ESDA, модель человеческого тела для измерения емкости представляет собой конденсатор 100 пф , соединенный последовательно с резистором 1,5к.
Т.е. в плане алгоритма, тут все вполне сходится даже с солидным запасом.
Не совсем понятно как все это соотносится с задачей ТС, т.е. насколько может измениться емкость в его случае.