Самодельная сенсорная кнопка вместо датчика уровня жидкости

Jonotan75
Offline
Зарегистрирован: 20.03.2022

Доброго времени суток! Решил сделать датчик уровень жидкости на базе самодельного сенсора, взял обычную скрепку скрутил ее спиралью припаял к ней резистор на 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]

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А Вы не могли бы хоть немного прокомментировать код? И заодно, привести содержимое лога, который Вы печатаете? А то Ваши заявления, что "вместо постоянной 1 уже идет череда единиц и нулей" как-то повисают в воздухе. В каком месте оно идёт? Куда идёт?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Serial даёт задержку. Когда его убираешь - уходит и задержка.

Jonotan75
Offline
Зарегистрирован: 20.03.2022
[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.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Jonotan75, вопрос конечно интересный. Но вот незадача. Как научить человека написать цифровой автомат, если объяснения занимают кучу времени. И нет гарантии что дойдет. Так что лучше с этим делом лучше завязать сразу.

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021
void loop() {
  sensor_data(sen_arr, row1);
}

Не очень понятно, как оно работает, и так же переменная row...

void sensor_data(int sen_arr[4][2], int row) {

Датчики, для отладки, лучше временно заменить на кнопки с фиксацией или выключатели

 

 

ВН
Offline
Зарегистрирован: 25.02.2016

Не тема, а парад нелепостей, начиная с заголовка 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Что у Вас в массиве sen_arr? Если верить строкам №№30-31, то номера пинов. Но тогда зачем Вы ему что-то присваиваете в строках №№ 41 и 54?

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Что у Вас в массиве sen_arr? Если верить строкам №№30-31, то номера пинов. Но тогда зачем Вы ему что-то присваиваете в строках №№ 41 и 54?

судя по коду, массив sen_arr двумерный, в каждой строчке первый элемент - номер пина кнопки, второй - состояние этой кнопки.

b707
Offline
Зарегистрирован: 26.05.2017

согласен с BH, код - сплошная нелепость, начиная с описания переменных и заголовка функции

Вот еще вот это мне понравилось:

 //if (sen_arr[row1][1] == 0 ){
  //   Serial.println(sen_arr[row1][1]);
  //  } else {
  //    Serial.println(sen_arr[row1][1]);
  //  }

проверяем переменную, если ноль - печатаем, а если нет... все равно печатаем!

"К чему эти метания. Маша?"

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

проверяем переменную, если ноль - печатаем, а если нет... все равно печатаем!

Почему Вы не допускаете, что человек - пофигист и так самовыражается?

Jonotan75
Offline
Зарегистрирован: 20.03.2022

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

Jonotan75
Offline
Зарегистрирован: 20.03.2022

Суть в чем скетч, проверить можно ли настроить сенсор как датчик уровня или нет, а принты для контроля и проверки. Проверка показала что задержки (выполнения команд) влияют на состояние сенсора. Готов выслушать дельные предложения по коду.

Jonotan75
Offline
Зарегистрирован: 20.03.2022

ВН пишет:

Не тема, а парад нелепостей, начиная с заголовка 

 

Для каждого своя важная тема, у Вас есть недорогое решение датчика уровня минимум в двух положениях в одной емкости?

Jonotan75
Offline
Зарегистрирован: 20.03.2022

ЕвгенийП пишет:

b707 пишет:

проверяем переменную, если ноль - печатаем, а если нет... все равно печатаем!

Почему Вы не допускаете, что человек - пофигист и так самовыражается?

Готов выслушать все включая критику) Но лучше дельные предложения по коду как настроить датчик!)

 

Jonotan75
Offline
Зарегистрирован: 20.03.2022

ЕвгенийП пишет:

Что у Вас в массиве sen_arr? Если верить строкам №№30-31, то номера пинов. Но тогда зачем Вы ему что-то присваиваете в строках №№ 41 и 54?

Массив пинов и состояний на 4 датчика. Это фрагмент кода, хочу настроить один датчик.

lilik
Offline
Зарегистрирован: 19.10.2017

А где схему такого сенсора взяли? Он вообще может корректно работать, от пальца? :-)

ВН
Offline
Зарегистрирован: 25.02.2016

Jonotan75 пишет:
Для каждого своя важная тема....

само собой, у вас проблема в тм, что не можете упорядочить свои мысли. Заголовок написан про одно, первое же предложение начинается про другое, схема описана так, что работать в принципе не может, скетч так вообще отдельная песня. Вы хоть с физ т.з. понимаете, как хотите что-то получить? Я вот думаю что ни фига не понимаете.

Jonotan75 пишет:
у Вас есть недорогое решение датчика уровня минимум в двух положениях в одной емкости?

да еще лет 30 назад сделал куму в деревню автомат подкачки воды на одном  555 таймере, когда задолбался чинить его поделку на десятке микрух 176 серии, и он благополучно отпахал лет 20. потому как "ломаться там просто нечему".  последнее сказа как раз кум

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Jonotan75 пишет:

Но лучше дельные предложения по коду как настроить датчик!)

Блин, ну отвечайте же "дельно" на вопросы.

Я Вас спросил, что именно в этом массиве? А Вы мне что? 

Jonotan75 пишет:

Массив пинов и состояний на 4 датчика. Это фрагмент кода, хочу настроить один датчик.

Объясните же толком, что именно в этом массиве?

Или это только мне нужно?

Jonotan75
Offline
Зарегистрирован: 20.03.2022

ЕвгенийП пишет:

Jonotan75 пишет:

Но лучше дельные предложения по коду как настроить датчик!)

Блин, ну отвечайте же "дельно" на вопросы.

Я Вас спросил, что именно в этом массиве? А Вы мне что? 

Jonotan75 пишет:

Массив пинов и состояний на 4 датчика. Это фрагмент кода, хочу настроить один датчик.

Объясните же толком, что именно в этом массиве?

Или это только мне нужно?

столбец 0 - пин датчиков, столбец 1 - состояние датчиков, по строкам 0-3 - четыре датчика, вроде все?

Jonotan75
Offline
Зарегистрирован: 20.03.2022

ВН пишет:

Jonotan75 пишет:
Для каждого своя важная тема....

само собой, у вас проблема в тм, что не можете упорядочить свои мысли. Заголовок написан про одно, первое же предложение начинается про другое, схема описана так, что работать в принципе не может, скетч так вообще отдельная песня. Вы хоть с физ т.з. понимаете, как хотите что-то получить? Я вот думаю что ни фига не понимаете.

Jonotan75 пишет:
у Вас есть недорогое решение датчика уровня минимум в двух положениях в одной емкости?

да еще лет 30 назад сделал куму в деревню автомат подкачки воды на одном  555 таймере, когда задолбался чинить его поделку на десятке микрух 176 серии, и он благополучно отпахал лет 20. потому как "ломаться там просто нечему".  последнее сказа как раз кум

Разложу как вижу:

1) Касательно заголовка - чувствительность датчика будет увеличена, чтобы небыло прямого прикосновения? это конечная цель, 2) первое предложение - фиксация состояния как я понимаю не зависит от чувствительности если есть алгоритм, 3) по схеме - вот я и прошу определится - возможно это сделать, 4) скетч - набросок алгоритма который не идеален, коменты не убраны специально чтобы показать суть проблемы. Как-то так так что скажите по сути дела, как сделать правильно?!

 

 

Jonotan75
Offline
Зарегистрирован: 20.03.2022

lilik пишет:

А где схему такого сенсора взяли? Он вообще может корректно работать, от пальца? :-)

Схема обычная в инете есть, как кнопка работает идеально

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Дожили, у народа на ТТР223 денег нет

Green
Offline
Зарегистрирован: 01.10.2015

То ли ещё будет.(

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Как по мне, крутить в лупе с большой скоростью опрос датчиков не следует

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;
  }
}

 

lilik
Offline
Зарегистрирован: 19.10.2017

Jonotan75 пишет:

lilik пишет:

А где схему такого сенсора взяли? Он вообще может корректно работать, от пальца? :-)

Схема обычная в инете есть, как кнопка работает идеально

По словесному описанию исходного сообщения схема такая :-)

lilik
Offline
Зарегистрирован: 19.10.2017

... взял обычную скрепку скрутил ее спиралью припаял к ней резистор на 1МОм подключил к пину 7, другой контакт от спирали к питанию 5V...

Или я упустил что?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вопрос по коду из #3

В чём смысл цикла в строка №34-35. Что там делается? Генерируется случайное целое число в переменной t? Или что?

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

DetSimen пишет:

Дожили, у народа на ТТР223 денег нет

ТТР223 нормально работает как кнопка. Как датчик уровня - не получится, думал об этом.  

При подаче питания у нее начинается процесс самокалибровки. 

После самокалибровки переходит в режим выключено, даже если был прижат палец.

Хотел определять опускание воды ниже определенного уровня в пластиковой емкости, в автополивалке.

 

 

Jonotan75
Offline
Зарегистрирован: 20.03.2022

DetSimen пишет:

Дожили, у народа на ТТР223 денег нет

Проблема в том, что в ТТР223 нет удержания 1, т.е. есть триггер если соединить перемычку - при одном нажатии фиксирует 1, при повторном - убирает 1 на 0. т.е. речь темы использование сенсора как датчика уровня воды необходимо при наличии воды  (читай нажатии) фиксировать 1, а при опускания уровня воды (читай отжатия) фиксировать 0. Если в обычном режиме при нажатии более 10сек. срывается уровень 1 до 0. Вот такая проблема с вашей кнопкой...

Jonotan75
Offline
Зарегистрирован: 20.03.2022

ЕвгенийП пишет:

Вопрос по коду из #3

В чём смысл цикла в строка №34-35. Что там делается? Генерируется случайное целое число в переменной t? Или что?

Нашел в инете, видео мужик нормально принцип объясняет работы кнопки и скетча http://www.youtube.com/watch?v=5R0TVoSefwM

 

Jonotan75
Offline
Зарегистрирован: 20.03.2022

Дим-мычъ пишет:

Как по мне, крутить в лупе с большой скоростью опрос датчиков не следует

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 при отжатии сенсора.. это сильно озадачивает как сделать... ( Скинул ролик может понятней будет.

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Jonotan75 пишет:

 основная проблема фиксить чистую 1 при нажатии и удержании и 0 при отжатии сенсора.. это сильно озадачивает как сделать... ( Скинул ролик может понятней будет.

Считать "тики" и , опытным путём , определить , что, например(условно) , меньше 5-бак пустой(0). больше 7- полный(1).

Середина - "серая зона" дребезг. 

Ещё как вариант поискать другие датчики, т.к этот возможно будет работать нестабильно

И, кстати, вода - не палец, возможно ёмкость не увеличится, а, наоборот уменьшится, ещё от бака будет зависеть и ещё чего-нибудь...))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Возьми вот такой даччик и не тра... мосх. На моей бочке 2 сезона отстоял, грядёт третий.  У меня только сверху стоИт, но ничего не мешает и в середину и в низ ёмкости врЕзаться

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Jonotan75 пишет:

ЕвгенийП пишет:

Вопрос по коду из #3

В чём смысл цикла в строка №34-35. Что там делается? Генерируется случайное целое число в переменной t? Или что?

Нашел в инете, видео мужик нормально принцип объясняет работы кнопки и скетча http://www.youtube.com/watch?v=5R0TVoSefwM

Простите, я не смотрю видео на ютубе (мне порнхаба хватает), Вы можете объяснить что делается в этих двух строчках Вашего (а не автора видео) кода? Генерируется случайное число? Или что?

ВН
Offline
Зарегистрирован: 25.02.2016

увеличение входной емкости он там пытается фиксировать

если t==0 емкость исходная, если больше нуля - емкость увеличилась

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ВН пишет:

увеличение входной емкости он там пытается фиксировать

если t==0 емкость исходная, если больше нуля - емкость увеличилась

Но там ведь может получиться любое число, в том числе и 0, и отрицательное, и какое угодно. Это же тупой цикл безо всяких задержек. За какое время переполнится int, станет отрицательным, а потом и снова нулём? На обычной 16МГц avr-дуине отрицательным оно станет через 160 миллисекунд, а нулём - через 320 миллисекунд! Это нормально для данной задачи? Я не знаю, может и нормально, но я пытаюсь, подвести ТС к понимаю этого момента, а он мне предлагает какие-то видосы. Они мне нужны, эти видосы?  Зачем? Мне нужно что-то понять или самому ТС?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

Возьми вот такой даччик и не тра... мосх. На моей бочке 2 сезона отстоял, грядёт третий.  У меня только сверху стоИт, но ничего не мешает и в середину и в низ ёмкости врЕзаться

герконовый?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ua6em пишет:

герконовый?

да

SLKH
Offline
Зарегистрирован: 17.08.2015

SergeiL пишет:

DetSimen пишет:

Дожили, у народа на ТТР223 денег нет

ТТР223 нормально работает как кнопка. Как датчик уровня - не получится, думал об этом.  

При подаче питания у нее начинается процесс самокалибровки. 

После самокалибровки переходит в режим выключено, даже если был прижат палец.

Хотел определять опускание воды ниже определенного уровня в пластиковой емкости, в автополивалке.

 

 

У меня тоже не получилось. 

ВН
Offline
Зарегистрирован: 25.02.2016

ЕвгенийП пишет:
Но там ведь может получиться любое число, в том числе и 0, и отрицательное, и какое угодно. Это же тупой цикл безо всяких задержек. 

Чисто теоретически любое. 

В предыдущих строках (30,31) был сброс емкости нулем, теперь пин читается как вход 32, а емкость заряжается через резистор 1М. Спустя некоторое время  от момента сброса напряжение на входе достигнет половины питания и вместо нуля будет читаться единица. Она и останавливает цикл.

Фактически настраиваемый параметр это хреновины вот это время задержки 

33   delayMicroseconds(25);

за это время напряжение должно дорасти до пол питания, если нет касания сенсора, тогда t =0.

lilik
Offline
Зарегистрирован: 19.10.2017

А вообще этот аппаратно-программный сенсор успешен?

не проще так:?

Гермотрубка, герконы, резисторы, поплавок-кольцо-магнит.

ВН
Offline
Зарегистрирован: 25.02.2016

lilik пишет:
А вообще этот аппаратно-программный сенсор успешен?

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

Jonotan75
Offline
Зарегистрирован: 20.03.2022

ua6em пишет:

DetSimen пишет:

Возьми вот такой даччик и не тра... мосх. На моей бочке 2 сезона отстоял, грядёт третий.  У меня только сверху стоИт, но ничего не мешает и в середину и в низ ёмкости врЕзаться

герконовый?

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

Jonotan75
Offline
Зарегистрирован: 20.03.2022

Дим-мычъ пишет:

Jonotan75 пишет:

 основная проблема фиксить чистую 1 при нажатии и удержании и 0 при отжатии сенсора.. это сильно озадачивает как сделать... ( Скинул ролик может понятней будет.

Считать "тики" и , опытным путём , определить , что, например(условно) , меньше 5-бак пустой(0). больше 7- полный(1).

Середина - "серая зона" дребезг. 

Ещё как вариант поискать другие датчики, т.к этот возможно будет работать нестабильно

И, кстати, вода - не палец, возможно ёмкость не увеличится, а, наоборот уменьшится, ещё от бака будет зависеть и ещё чего-нибудь...))

ТТР223 нормально на воду реагирует, но недолго). Думаю вопрос только алгоритма и все заработает. Диапазон регистрации 1 или 0 параметром можно регулировать для гарантии. Можно по тикам по подробнее, какой-нибудь фрагмент кода применительно к ситуации.. буду экспериментировать)

Jonotan75
Offline
Зарегистрирован: 20.03.2022

ВН пишет:

ЕвгенийП пишет:
Но там ведь может получиться любое число, в том числе и 0, и отрицательное, и какое угодно. Это же тупой цикл безо всяких задержек. 

Чисто теоретически любое. 

В предыдущих строках (30,31) был сброс емкости нулем, теперь пин читается как вход 32, а емкость заряжается через резистор 1М. Спустя некоторое время  от момента сброса напряжение на входе достигнет половины питания и вместо нуля будет читаться единица. Она и останавливает цикл.

Фактически настраиваемый параметр это хреновины вот это время задержки 

33   delayMicroseconds(25);

за это время напряжение должно дорасти до пол питания, если нет касания сенсора, тогда t =0.

Все так и есть, спасибо) Минуса быть не может из-за задержки, только 0 и больше, я упростил для контроля ситуации - только 0 или 1

ua4lcn
Offline
Зарегистрирован: 27.02.2016

Для контроля уровня жидкости для радиопрозрачной емкости (Стекло или пластмасса)использую такой  датчик из Китая:

,

У этого датчика нет самокалибровки в момент включения, как у TTP223. В этом конкретном датчике имеется выход-открытый коллектор.Использую такой датчик в схеме с Attiny85 для контроля уровня тосола в авто.Работает очень хорошо, и зимой и летом. 

 

 

 

 

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Jonotan75 пишет:

Можно по тикам по подробнее, какой-нибудь фрагмент кода применительно к ситуации.. буду экспериментировать)

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

kalapanga
Offline
Зарегистрирован: 23.10.2016

Jonotan75 пишет:

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

Осталось только услышать, что эти десятки граммов нужно ловить на тонне жидкости, а жидкость эта - расплавленный чугун! Шутка, если что. Но есть сомнения, тот ли Вы метод измерения осваиваете...

Green
Offline
Зарегистрирован: 01.10.2015

kalapanga пишет:
Шутка, если что.

"А сколько наших пыталось перепрыгнуть тот ручей в литейном..."

ВН
Offline
Зарегистрирован: 25.02.2016

ЕвгенийП пишет:
За какое время переполнится int, станет отрицательным, а потом и снова нулём? На обычной 16МГц avr-дуине отрицательным оно станет через 160 миллисекунд, а нулём - через 320 миллисекунд! Это нормально для данной задачи? 

Вернемся к поставленному вопросу, чтобы оценить реалистичность алгоритма.

Для RC цепочки время заряда до пол питания определяется формулой  0,69*RC, и где R =1 МОм,

подставив в нее граничные значения 25 мкс и 160 мс и рассчитав  емкость получим, что

 емкость самого контакта должна быть не более 36 пф, а максимальная емкость не более 200 нФ.

200 нФ это очень большая емкость для уединенного тела.   По определению ESDA, модель человеческого тела для измерения емкости представляет собой конденсатор 100 пф , соединенный последовательно с резистором 1,5к. 

Т.е. в плане алгоритма, тут все вполне сходится даже с солидным запасом.

Не совсем понятно как все это соотносится с задачей ТС, т.е. насколько может измениться емкость в его случае.