"Шум" аналоговых входов.

Luck2071
Luck2071 аватар
Offline
Зарегистрирован: 01.02.2017

Доброго дня!

Столкнулся с большой проблемой, очень шумят аналоговые входа (грешу на Б/П). 

Нужно считать данные с датчиков (9 штук), нашел программу которая очень хороше с этим справляется, а вот как её настроить на 9 штук непонимаю.

Буду признателен если подскажете.

filtracia_signala.png

int sensorPin = A0; // номер аналогового входа

// функция считывает аналоговый вход заданное количество раз
// и возвращает отфильтрованное значение
int readMean(int pin, int samples){
  // переменная для хранения суммы считанных значений
  int sum = 0;
  // чтение и складывание значений
  for (int i = 0; i < samples; i++){
    sum = sum + analogRead(pin);
  }
  // делим сумму значений на количество измерений
  sum = sum/samples;
  // возвращаем среднее значение
  return sum;
}

// функция считывает аналоговый вход заданное количество раз
// и возвращает медианное отфильтрованное значение
int readMedian (int pin, int samples){
  // массив для хранения данных
  int raw[samples];
  // считываем вход и помещаем величину в ячейки массива
  for (int i = 0; i < samples; i++){
    raw[i] = analogRead(pin);
  }
  // сортируем массив по возрастанию значений в ячейках
  int temp = 0; // временная переменная

  for (int i = 0; i < samples; i++){
    for (int j = i; j < samples - 1; j++){
      if (raw[j] > raw[j + 1]){
        temp = raw[j];
        raw[j] = raw[j + 1];
        raw[j + 1] = temp;
      }
    }
  }
  // возвращаем значение средней ячейки массива
  return raw[samples/2];
}
void setup(){
  Serial.begin(9600);
}
void loop(){
  // выводим значение на аналоговом входе в монитор порта
  Serial.print(analogRead(sensorPin));
  Serial.print(" ");
  // выводим среднеизмеренное значение
  Serial.print(readMean(sensorPin, 15));
  Serial.print(" ");
  // выводим медианное отфильтрованное значение
  Serial.println(readMedian(sensorPin, 15));
  delay(100);
}
vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Может так

int sensorPin = A0; // номер аналогового входа
int MeanA1;
int MedianA1;
int MeanA2;
int MedianA2;
int MeanA3;
int MedianA3;
//и Т.Д.

// функция считывает аналоговый вход заданное количество раз
// и возвращает отфильтрованное значение
int readMean(int pin, int samples){
  // переменная для хранения суммы считанных значений
  int sum = 0;
  // чтение и складывание значений
  for (int i = 0; i < samples; i++){
    sum = sum + analogRead(pin);
  }
  // делим сумму значений на количество измерений
  sum = sum/samples;
  // возвращаем среднее значение
  return sum;
}

// функция считывает аналоговый вход заданное количество раз
// и возвращает медианное отфильтрованное значение
int readMedian (int pin, int samples){
  // массив для хранения данных
  int raw[samples];
  // считываем вход и помещаем величину в ячейки массива
  for (int i = 0; i < samples; i++){
    raw[i] = analogRead(pin);
  }
  // сортируем массив по возрастанию значений в ячейках
  int temp = 0; // временная переменная

  for (int i = 0; i < samples; i++){
    for (int j = i; j < samples - 1; j++){
      if (raw[j] > raw[j + 1]){
        temp = raw[j];
        raw[j] = raw[j + 1];
        raw[j + 1] = temp;
      }
    }
  }
  // возвращаем значение средней ячейки массива
  return raw[samples/2];
}
void setup(){
  Serial.begin(9600);
}
void loop(){
sensorPin = A1;
MeanA1 = readMean(sensorPin, 15);
MedianA1 = readMedian(sensorPin, 15);
sensorPin = A2;
MeanA2 = readMean(sensorPin, 15);
MedianA2 = readMedian(sensorPin, 15);
sensorPin = A3;
MeanA3 = readMean(sensorPin, 15);
MedianA3 = readMedian(sensorPin, 15);
//и Т.Д.

  // выводим значение на аналоговом входе в монитор порта
  Serial.print(analogRead(sensorPin));
  Serial.print(" ");
  // выводим среднеизмеренное значение
Serial.print("  MeanA1 - ");
  Serial.print(MeanA1);
  Serial.print("  MedianA1- ");
Serial.println(MedianA1);
  Serial.print("  MeanA2 - ");
  Serial.print(MeanA2);
  Serial.print("  MedianA2- ");
Serial.println(MedianA2);
Serial.print("  MeanA3 - ");
  Serial.print(MeanA3);
  Serial.print("  MedianA3- ");
Serial.println(MedianA3);
//и Т.Д.

  delay(100);
}

 

Luck2071
Luck2071 аватар
Offline
Зарегистрирован: 01.02.2017

Спасибо!!!

Буду пробывать....

Luck2071
Luck2071 аватар
Offline
Зарегистрирован: 01.02.2017
Неподскажите что это значит? 
 
Arduino: 1.8.5 (Windows 7), Плата:"Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"
 
 
 
exit status 1
stray '\302' in program
 
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
 
Luck2071
Luck2071 аватар
Offline
Зарегистрирован: 01.02.2017
Вот что получилось 
 
Но почемуто не работает???
 
Может подскажите что делаю не так...
 
vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Я думал ч то Ваш скетч рабочий поэтому и предложил продолжение опроса по вашему коду. Но скорей всего надо ТАК

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Хтя не правильно бопробуйте так А если не получится то пишете что именно не так

MeanA1 = readMean(A0, 15);
 MedianA1 = readMedian(A0, 15);

 MeanA2 = readMean(A1, 15);
 MedianA2 = readMedian(A1, 15);

 MeanA3 = readMean(A2, 15);
 MedianA3 = readMedian(A2, 15);

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

И еще не гоните проверку сразу на все 9 пинов. Попробуйте сначала на 3

sadman41
Offline
Зарегистрирован: 19.10.2016

vosara пишет:

Я думал ч то Ваш скетч рабочий поэтому и предложил продолжение опроса по вашему коду. Но скорей всего надо ТАК

Вы еще не поняли основной принцип последних новорегов? Я расскажу: нашёл в инетке любой говноскетч, не проверяй, не разбирайся - просто тащи на ардуино.ру и пиши, что надо сделать. А рисовать что и куда подключено... слишком много чести для ботанов, которые помогают. Они сами все додумают, отмакетируют и поправят. А когда весь код отполируют - следует написать, что на его Arduino Mini Pro только пять аналоговых входов и нихера их ботанский скейтч не работает как заказывалось. 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

vosara пишет:

И еще не гоните проверку сразу на все 9 пинов. Попробуйте сначала на 3

Вот я проверил на з пина -смотрите

int sensorPin = A0; // номер аналогового входа
int MeanA1;
int MedianA1;
int MeanA2;
int MedianA2;
int MeanA3;
int MedianA3;
// функция считывает аналоговый вход заданное количество раз
// и возвращает отфильтрованное значение
int readMean(int pin, int samples){
  // переменная для хранения суммы считанных значений
  int sum = 0;
  // чтение и складывание значений
  for (int i = 0; i < samples; i++){
    sum = sum + analogRead(pin);
  }
  // делим сумму значений на количество измерений
  sum = sum/samples;
  // возвращаем среднее значение
  return sum;
}

// функция считывает аналоговый вход заданное количество раз
// и возвращает медианное отфильтрованное значение
int readMedian (int pin, int samples){
  // массив для хранения данных
  int raw[samples];
  // считываем вход и помещаем величину в ячейки массива
  for (int i = 0; i < samples; i++){
    raw[i] = analogRead(pin);
  }
  // сортируем массив по возрастанию значений в ячейках
  int temp = 0; // временная переменная

  for (int i = 0; i < samples; i++){
    for (int j = i; j < samples - 1; j++){
      if (raw[j] > raw[j + 1]){
        temp = raw[j];
        raw[j] = raw[j + 1];
        raw[j + 1] = temp;
      }
    }
  }
  // возвращаем значение средней ячейки массива
  return raw[samples/2];
}
void setup(){
  Serial.begin(9600);
}
void loop(){

MeanA1 = readMean(A0, 15);
 MedianA1 = readMedian(A0, 15);

 MeanA2 = readMean(A1, 15);
 MedianA2 = readMedian(A1, 15);

 MeanA3 = readMean(A2, 15);
 MedianA3 = readMedian(A2, 15);

Serial.print("  MeanA1 - ");
  Serial.print(MeanA1);
  Serial.print("  MedianA1- ");
Serial.println(MedianA1);
  Serial.print("  MeanA2 - ");
  Serial.print(MeanA2);
  Serial.print("  MedianA2- ");
Serial.println(MedianA2);
Serial.print("  MeanA3 - ");
  Serial.print(MeanA3);
Serial.print("  MedianA3- ");
Serial.println(MedianA3);
  delay(100);
}
Вывод в сериал
  MeanA1 - 543  MedianA1- 543
  MeanA2 - 614  MedianA2- 614
  MeanA3 - 410  MedianA3- 410
  MeanA1 - 543  MedianA1- 543
  MeanA2 - 614  MedianA2- 614
  MeanA3 - 410  MedianA3- 410
  MeanA1 - 543  MedianA1- 543
  MeanA2 - 614  MedianA2- 614
  MeanA3 - 410  MedianA3- 410
  MeanA1 - 543  MedianA1- 543
  MeanA2 - 614  MedianA2- 614
  MeanA3 - 410  MedianA3- 410
  MeanA1 - 819  MedianA1- 819
  MeanA2 - 266  MedianA2- 266
  MeanA3 - 788  MedianA3- 788
  MeanA1 - 819  MedianA1- 819
  MeanA2 - 266  MedianA2- 266
  MeanA3 - 788  MedianA3- 788
  MeanA1 - 819  MedianA1- 819
  MeanA2 - 266  MedianA2- 266
  MeanA3 - 788  MedianA3- 788
  MeanA1 - 819  MedianA1- 819
  MeanA2 - 266  MedianA2- 266
  MeanA3 - 788  MedianA3- 788
  MeanA1 - 819  MedianA1- 819
  MeanA2 - 266  MedianA2- 266
  MeanA3 - 788  MedianA3- 788
  MeanA1 - 819  MedianA1- 819
  MeanA2 - 266  MedianA2- 266
  MeanA3 - 788  MedianA3- 788
  MeanA1 - 819  MedianA1- 819
  MeanA2 - 266  MedianA2- 266
  MeanA3 - 788  MedianA3- 788
  MeanA1 - 819  MedianA1- 819
  MeanA2 - 266  MedianA2- 266
  MeanA3 - 788  MedianA3- 788
  MeanA1 - 819  MedianA1- 819
  MeanA2 - 266  Me

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

sadman41 пишет:

vosara пишет:

Я думал ч то Ваш скетч рабочий поэтому и предложил продолжение опроса по вашему коду. Но скорей всего надо ТАК

Вы еще не поняли основной принцип последних новорегов? Я расскажу: нашёл в инетке любой говноскетч, не проверяй, не разбирайся - просто тащи на ардуино.ру и пиши, что надо сделать. А рисовать что и куда подключено... слишком много чести для ботанов, которые помогают. Они сами все додумают, отмакетируют и поправят. А когда весь код отполируют - следует написать, что они на его Arduino Mini Pro только пять аналоговых входов и нихера их ботанский скейтч не работает как заказывалось. 

Да я все понимаю но человек старается вон даже график привел

sadman41
Offline
Зарегистрирован: 19.10.2016

vosara пишет:

Да я все понимаю но человек старается вон даже график привел

Цельнотянутый с http://geekmatic.in.ua/filtracia_shumov_analogovogo_signala

В моем понимании стараться - это как-то иначе. Впрочем, время ваше - тратьте как хотите.

Luck2071
Luck2071 аватар
Offline
Зарегистрирован: 01.02.2017

Большое спасибо!!!

Работает. Буду пробывать на 9 пинов и в XL график.

Luck2071
Luck2071 аватар
Offline
Зарегистрирован: 01.02.2017

Первоначальный скетч работает, но только на один пин.

Luck2071
Luck2071 аватар
Offline
Зарегистрирован: 01.02.2017

Как бутто вы небыли ботаном и не обращались за помощю к компетентным людям.

Слаб я еще в програмировании, но это можно  исправить.

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

Все мы когдато писали в пиленки......

Luck2071
Luck2071 аватар
Offline
Зарегистрирован: 01.02.2017

sadman41 пишет:

vosara пишет:

Я думал ч то Ваш скетч рабочий поэтому и предложил продолжение опроса по вашему коду. Но скорей всего надо ТАК

Вы еще не поняли основной принцип последних новорегов? Я расскажу: нашёл в инетке любой говноскетч, не проверяй, не разбирайся - просто тащи на ардуино.ру и пиши, что надо сделать. А рисовать что и куда подключено... слишком много чести для ботанов, которые помогают. Они сами все додумают, отмакетируют и поправят. А когда весь код отполируют - следует написать, что на его Arduino Mini Pro только пять аналоговых входов и нихера их ботанский скейтч не работает как заказывалось. 

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

Luck2071
Luck2071 аватар
Offline
Зарегистрирован: 01.02.2017

sadman41 пишет:

vosara пишет:

Да я все понимаю но человек старается вон даже график привел

Цельнотянутый с http://geekmatic.in.ua/filtracia_shumov_analogovogo_signala

В моем понимании стараться - это как-то иначе. Впрочем, время ваше - тратьте как хотите.

Я так понимаю у вас его много, лучше помогли бы, а не демагогию разводили.

Luck2071
Luck2071 аватар
Offline
Зарегистрирован: 01.02.2017

vosara пишет:

vosara пишет:

И еще не гоните проверку сразу на все 9 пинов. Попробуйте сначала на 3

Вот я проверил на з пина -смотрите

int sensorPin = A0; // номер аналогового входа
int MeanA1;
int MedianA1;
int MeanA2;
int MedianA2;
int MeanA3;
int MedianA3;
// функция считывает аналоговый вход заданное количество раз
// и возвращает отфильтрованное значение
int readMean(int pin, int samples){
  // переменная для хранения суммы считанных значений
  int sum = 0;
  // чтение и складывание значений
  for (int i = 0; i < samples; i++){
    sum = sum + analogRead(pin);
  }
  // делим сумму значений на количество измерений
  sum = sum/samples;
  // возвращаем среднее значение
  return sum;
}

// функция считывает аналоговый вход заданное количество раз
// и возвращает медианное отфильтрованное значение
int readMedian (int pin, int samples){
  // массив для хранения данных
  int raw[samples];
  // считываем вход и помещаем величину в ячейки массива
  for (int i = 0; i < samples; i++){
    raw[i] = analogRead(pin);
  }
  // сортируем массив по возрастанию значений в ячейках
  int temp = 0; // временная переменная

  for (int i = 0; i < samples; i++){
    for (int j = i; j < samples - 1; j++){
      if (raw[j] > raw[j + 1]){
        temp = raw[j];
        raw[j] = raw[j + 1];
        raw[j + 1] = temp;
      }
    }
  }
  // возвращаем значение средней ячейки массива
  return raw[samples/2];
}
void setup(){
  Serial.begin(9600);
}
void loop(){

MeanA1 = readMean(A0, 15);
 MedianA1 = readMedian(A0, 15);

 MeanA2 = readMean(A1, 15);
 MedianA2 = readMedian(A1, 15);

 MeanA3 = readMean(A2, 15);
 MedianA3 = readMedian(A2, 15);

Serial.print("  MeanA1 - ");
  Serial.print(MeanA1);
  Serial.print("  MedianA1- ");
Serial.println(MedianA1);
  Serial.print("  MeanA2 - ");
  Serial.print(MeanA2);
  Serial.print("  MedianA2- ");
Serial.println(MedianA2);
Serial.print("  MeanA3 - ");
  Serial.print(MeanA3);
Serial.print("  MedianA3- ");
Serial.println(MedianA3);
  delay(100);
}
Вывод в сериал
  MeanA1 - 543  MedianA1- 543
  MeanA2 - 614  MedianA2- 614
  MeanA3 - 410  MedianA3- 410
  MeanA1 - 543  MedianA1- 543
  MeanA2 - 614  MedianA2- 614
  MeanA3 - 410  MedianA3- 410
  MeanA1 - 543  MedianA1- 543
  MeanA2 - 614  MedianA2- 614
  MeanA3 - 410  MedianA3- 410
  MeanA1 - 543  MedianA1- 543
  MeanA2 - 614  MedianA2- 614
  MeanA3 - 410  MedianA3- 410
  MeanA1 - 819  MedianA1- 819
  MeanA2 - 266  MedianA2- 266
  MeanA3 - 788  MedianA3- 788
  MeanA1 - 819  MedianA1- 819
  MeanA2 - 266  MedianA2- 266
  MeanA3 - 788  MedianA3- 788
  MeanA1 - 819  MedianA1- 819
  MeanA2 - 266  MedianA2- 266
  MeanA3 - 788  MedianA3- 788
  MeanA1 - 819  MedianA1- 819
  MeanA2 - 266  MedianA2- 266
  MeanA3 - 788  MedianA3- 788
  MeanA1 - 819  MedianA1- 819
  MeanA2 - 266  MedianA2- 266
  MeanA3 - 788  MedianA3- 788
  MeanA1 - 819  MedianA1- 819
  MeanA2 - 266  MedianA2- 266
  MeanA3 - 788  MedianA3- 788
  MeanA1 - 819  MedianA1- 819
  MeanA2 - 266  MedianA2- 266
  MeanA3 - 788  MedianA3- 788
  MeanA1 - 819  MedianA1- 819
  MeanA2 - 266  MedianA2- 266
  MeanA3 - 788  MedianA3- 788
  MeanA1 - 819  MedianA1- 819
  MeanA2 - 266  Me

 

Еще раз СПАСИБО!!! Работает на всех 9

sadman41
Offline
Зарегистрирован: 19.10.2016

Luck2071 пишет:

Я так понимаю у вас его много, лучше помогли бы, а не демагогию разводили.

Если бы я брал доллар каждый раз, когда слышал "лучше бы ты сделал <вписать нужное> за меня", я уже скупил бы половину Техаса.

Luck2071
Luck2071 аватар
Offline
Зарегистрирован: 01.02.2017

sadman41 пишет:

Luck2071 пишет:

Я так понимаю у вас его много, лучше помогли бы, а не демагогию разводили.

Если бы я брал доллар каждый раз, когда слышал "лучше бы ты сделал <вписать нужное> за меня", я уже скупил бы половину Техаса.

Если бы у бабушки был Х..., она была бы дедушкой.

b707
Онлайн
Зарегистрирован: 26.05.2017

Luck2071 пишет:

В 80 я сидел в технических библиотеках и искал инфу в книгах, а сейчас блогодоря интернету и хорошим людям...

... можно просто поклянчить, чтобы сделали за меня" - верно?

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

А вот если ты вместо минутного поиска в гугле идешь на форум и задаешь элементарный вопрос - это не значит "учиться", это нахлебничать.

Luck2071
Luck2071 аватар
Offline
Зарегистрирован: 01.02.2017

b707 пишет:

Luck2071 пишет:

В 80 я сидел в технических библиотеках и искал инфу в книгах, а сейчас блогодоря интернету и хорошим людям...

... можно просто поклянчить, чтобы сделали за меня" - верно?

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

А вот если ты вместо минутного поиска в гугле идешь на форум и задаешь элементарный вопрос - это не значит "учиться", это нахлебничать.

Каждый судит по себе.

Luck2071
Luck2071 аватар
Offline
Зарегистрирован: 01.02.2017

Добрый вечер!

Хочу предложить коммерческое предложение по написанию программы.

Бюджет 15 т.р. 

ТЗ подготовил.

Если интересно пишите на luck2071@yandex.ru

 

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

Мужики, а кто-нибудь может объяснить мне глубокий сермяжный смысл реализации в строках №№ XЗ - (ХЗ+10) скетча из первого поста сортировки методом пузырька, когда под рукой имеется библиотечная функция qsort - которая а) уже готова и б) заметно быстрее работает?

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

Luck2071 пишет:

Хочу предложить коммерческое предложение по написанию программы.

Для таких предложений есть специальный раздел. Многие из тамошних завсегдатаев других разделов не читают. так что лучше Вам запостить там.

sadman41
Offline
Зарегистрирован: 19.10.2016

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

Мужики, а кто-нибудь может объяснить мне глубокий сермяжный смысл реализации в строках №№ XЗ - (ХЗ+10) скетча из первого поста сортировки методом пузырька, когда под рукой имеется библиотечная функция qsort - которая а) уже готова и б) заметно быстрее работает?

Может "пузырек" более теплый и ламповый...

А ТС я писал, хотел ТЗ почитать - не отвечает.

Luck2071
Luck2071 аватар
Offline
Зарегистрирован: 01.02.2017

Спасибо!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

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

Мужики, а кто-нибудь может объяснить мне глубокий сермяжный смысл реализации в строках №№ XЗ - (ХЗ+10) скетча из первого поста сортировки методом пузырька, когда под рукой имеется библиотечная функция qsort - которая а) уже готова и б) заметно быстрее работает?

А можно в цифрах - насколько именно быстрее?

(на Pentium+ в данном конкретном случае пузырек работал бы быстрее, насчет AVR - не знаю)

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

andriano пишет:

А можно в цифрах - насколько именно быстрее?

В среднем

O(n2) против O(n x log(n))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

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

andriano пишет:

А можно в цифрах - насколько именно быстрее?

В среднем

O(n2) против O(n x log(n))

О() - имеет значение лишь для величин, стремящихся к бесконечности. Для конечных величин нужно считать точнее.

Итак:

Время пузырька C1*N^2

Время Хоара C2*N*log(N)

Даже глядя на код, не трудно сообразить, что C1<<C2 (где "<<" означете не сдвиг, а "много меньше").

У ТС длина сортируемого массива равна 15, при такой длине Pentium и выше быстрее выполняет сортировку пузырьком, чем сортировку Хоара. Я, честно говоря, надеялся, что Вы приведете данные для AVR, а Вы вместо этого из того, что C1*N^2 > C2*N*log(N) при больших N, делаете совершенно необоснованный вывод, что так же будет и при малых N. Что не есть правильно.

 

PS. Строго говоря, (C1*N^2 + C3*N) и (C2*N*log(N) + C4*N) соответственно.

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

Ну, я "в общем" говорил. Для 15 элементов, да, пузырёк, побыстрее будет.

Правда, если уж совсем по гамбургскому счёту, то так, как написано у ТС (вернее, у того, у кого он это стянул), сортировать не будет никак, потому что, автор, явно что-то покурил перед написанием (для ясности ума, наверное). Но если исправить ошибки ...