Весы с запоминанием показаний

kailot2

✩✩✩✩✩✩✩
16 Окт 2022
6
0
Всем привет! Есть весы ,на тензодатчике стоит ацп , которая по uart шлет показания на esp8266.
Esp в свою очередь должна выводить показания на дисплей и отдавать их на wifi.
Пока что код такой

C++:
void loop() {
  String recv_weight;
  char revc_cstr[10];
  char c;
  float ff;
  int i,j;
  recv_weight = Serial.readString();
  i = recv_weight.indexOf('$');
  if (i==-1) recv_weight.remove(0);
  else{
  recv_weight.remove(0,i+1);
  recv_weight.trim();
  j = recv_weight.toInt();
  ff = j * 0.24;
//Здесь вывод на дисплей

    }
  }

}
Задача сделать запоминание максимального веса и удержание его на дисплее до следующего замера. Подскажите хоть в каком направлении думать, а то что то никак не соображу.
udp скетч немного не тот что сейчас используется , просто его нет под рукой. Показания с ацп приходят в виде ascii строки вида "$hhhhhh/n"
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Что значит отдавать по WiFi?
В принципе можно сделать запись в файл, этот файл потом через веб морду смотреть и будет возможность скачать его. Я бы в эту сторону копал, подключил бы время и записывал в файл дату, время, вес. Тут нет ничего сложного, просто надо правильно понять задачу.
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
619
148
скетч немного не тот что сейчас используется
Я вот не понимаю этого. Написать о проблеме, приложить скетч, причём не целый. Люди начинают бросать свои дела, искать решения. А потом выясняется, что код другой и все потуги были напрасны. А ведь горело, что написал в 04:52. Подождал бы и сделал все по нормальному. Так нет же. Захотят ли тебе после такого помогать дальше?
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
Запоминать максимальное значение очень просто.
Сначала максимально значение всегда равно -1 (можно еще меньше)
При получении нового значения оно сравнивается с максимальным и , если надо, максимальное обновляется.
Ну и выводи всегда его. Причем если максимальное меньше нуля можно писать, что замеров не было.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
Причем если максимальное меньше нуля можно писать, что замеров не было.
Нулевой вес - тоже вес. :)

Тут еще проблема будет в том, что пиковое значение веса будет больше фактического, т.к. груз ставится с небольшой скоростью (ну, просто невозможно его поставить идеально с нулевой скоростью) ну или рука дрогнула и чуть надавила на весы.
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
Не такая же большая проблема, дождаться "устаканенного" значения с нужной точностью (колебания веса меньше заданного значения в течении
определенного времени).
 

kailot2

✩✩✩✩✩✩✩
16 Окт 2022
6
0
В общем тензодатчик стоит на проводе и измеряет давление пантографа проходящего вагона на провод. Тензодатчик подключен к 328 меге , которая используется как ацп и передает показания на esp. Esp в свою очередь выводит показания на светодиодный дисплей (матрицу p10), и так же обеспечивает веб-морду на которой эти показания будут доступны. Как определить максимальный вес понятно ,но вот как удерживать показания и как отделять циклы измерения (считай вагоны) друг от друга не понятно. К тому же не совсем разобрался с esp и ардуино средой, все-таки чистый си мне ближе.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
Что бы я сделал для начала:
Вывел бы значение с датчика в монитор порта в виде числа.
Открыл бы плоттер и посмотрел бы график, как он меняется от прохождения вагона.
Наверняка будут места с очень низким весом , что может быть признаком смены вагона. Но все это надо смотреть по месту.
Веб морда для этого не очень хороша, т.к. могут быть задержки передачи данных. Но общую информацию выводить вполне можно.
 
  • Лойс +1
Реакции: kailot2

kailot2

✩✩✩✩✩✩✩
16 Окт 2022
6
0
@Старик Похабыч,
Да , места с нулевым (или околонулевым) весом на графике будут.
Я думаю сделать так в плане алгоритма:
Производим измерения , если значение выше какого-то порога кладем его в переменную допустим а.Если следующее полученное значение выше а то заменяем а на него.
Если некоторое количество циклов измерения значение сильно ниже a (или околонулевое) то значит цикл измерения завершен, выводим а на дисплей, обнуляем а и начинаем заново.
Как то так.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
Вполне может сработать. Тут непонятна сама цель. Озвучена локальная задача. Очень часто при разработке человек с без опыта или с небольшим идет каким то одному ему задуманным путем, зачастую усложняя задачу в разы.
Добавлю. Возмодно понадобиться фильтрация поступающих данных, что то типа бегущего среднего.
 
Изменено:

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
Возмодно понадобиться фильтрация поступающих данных, что то типа бегущего среднего.
Не возможно, а нужно. Потому как в любом случае будут всплески значений, которые легко фильтруются медианным расчетом по последним 5(или больше) измерениям.
 

kailot2

✩✩✩✩✩✩✩
16 Окт 2022
6
0
@Геннадий П, Сегодня проверял работоспособность механической части,все заработало. Нагрузка возрастает достаточно плавно достигает максимума и достаточно быстро снижается.
Фильтрация всплесков и помех уже реализована на стороне ацп.

@Старик Похабыч,
Так измерение давления пантографа и есть сама цель. Нужно отображать на дисплее давление пантографа последнего прошедшего вагона.
Я что то при первом взгляде на задачу навыдумывал себе каких-то таймеров и прочего , и поэтому стал сомневаться.Фильтрация всплесков осуществляется как самой механической системой так и программно выборкой среднего из 100 измерений на стороне ацп.
На еспшке собственно интерфейс - сам дисплей для отображения , и веб-морда с которой можно будет забрать результаты измерений 1с-кой или еще чем ( это уже не моя забота, главное циферки вывести). Вот собственно и все, примерный план действий я накидал выше.
Остался вопрос по uart. Сейчас у меня данные с него пишутся в буфер , дальше по буферу происходит поиск спецсимвола "$" , после этого символа идет ascii строка со значением ацп. дальше строка преобразуется в число , множится-вычитается , и выводится на экран. После чего буфер сбрасывается и все начинается по новой. Вопрос как можно сделать более эффективно
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
Так последнего или максимального ? Алгоритмы разные будут.
Итак имеем значение на выходе весов гарантированное для пустой платформы. А так нужно значение для минимального вагона. Возьму условно 30 для 1-го варианта и 100 для пустого вагона. Тогда я бы взял 2 пороговых значения в 80 и 50, выше 80 будет значить есть вагон, а ниже нет вагона . Тогда алгоритм вижу такой:
1) максимальное значение на весах 0. Максимальный вес вагона 0. Число вагонов 0.
2) Считать значение весов
3) Если значение весов выше 80, то значит идет вагон. Запомнить время прохождения вагона (миллим) . Взять и текущего максимального значения и считанного максимальное и запомнить его как максимальное значение на весх
4) Если значение весрв ниже 50, то означает, что вагон прошел. Если при этом максимальное значение не равно 0, то значит что был вагон. Тогда можно увеличить счетчик вагонов на 1, отправить максимальное значение на весах куда следует, и обнулить его. Если надо, то до обнуления в этом месте можно определить максимальные вес из всех вагонов.
5) Если с момента прохождения последнего вагона прошло больше определенного времени, при этом число вагонов не равно 0, значит "поезд ушел", надо что то делать. Отправляются данные по максимальному весу, последнему вес, по кол-ву вагонов и все обнуляется.
6) Идем на пункт 2.

Вроде все написал как надо.

По уарту. я бы отправлял не аски, а целые числа. Условно если ацп выдает 2-хбайтное значение 0-65535, то этого это будет 2 байта. Далее если число вагонов может быть выше 255, то еще 2 байта под число вагонов.
Тогда можно передавать 4 байт, 2-первых будет вес, 2 вторых номер вагона. И пусть голова определяет максимальное или там какое.
Последними можно передать 4 нулевых байта, это будет означать , что поезд ушел.
Но тут вопрос в обратной связи. Например можно получать ответ от головы, что данные приняты.
Да, голова джет в пакте 4 байта. Если пришло меньше 4х за определенный интервал, надо в обратку послать сообщение об ошибке, что бы "модуль весов" повторил последние измерения.
 

kailot2

✩✩✩✩✩✩✩
16 Окт 2022
6
0
@Старик Похабыч,
Вагон проезжает один и может раз в час , в лучшем случае в 10-20 минут.Из-за конструктивных особенностей давление плавно возрастает и быстро падает. И вот из этой кривой нужно взять максимальное и выводить его на дисплей, до того времени пока не пойдет следующий вагон.
Сегодня обкатывал вот этот код, и он работает нормально. Все оказалось достаточно просто

"
C++:
void loop() {
zero_label:
weight = get_weigth();
///Режим ожидания вагона
if (weight < weight_trig) goto zero_label;
if (weight > weight_trig)
{
  while (weight > weight_trig )
  {
    weight = get_weigth();
    if (weight > prev)
    {
      prev = weight;
      disp = weight;
      disp_char = String(disp,1) + '   ';
    }
  }
}
prev = 0;
disp_char = String(disp,1) + '   ';
// }
" Теперь пытаюсь разобраться как сделать веб-интерфейс с рюшечками. Нужно поле для ввода коэффициента коррекции и две строчки с текущими показаниями и последними максимальными.