Сенсор үшін арифметикалық орта

Мен қолданыстағы код, бірақ арифметиканы қосқым келеді бұл дегеніміз. Менің мақсатым: A0-дің 5 мәнін оқып жатқанда, орташа мәнін аламын онда желдеткіш пен жетекші орнына қосылып, өшірілетін болады 5 жеке өлшем.

int tempPin = A0;
int fan = 3;
int led = 8;
int temp;
int tempreal;
int tempMin = 20;
int tempMax = 30;

void setup() 
{
  Serial.begin(9600);
  pinMode(fan, OUTPUT);
  pinMode(led, OUTPUT);
  pinMode(tempPin, INPUT);
}

void loop() 
{
  temp = analogRead(tempPin);
  tempreal = temp * 0.48828125;
  delay(1);
  if(tempreal > tempMax)
  {
    digitalWrite(fan,HIGH);
    digitalWrite(led,LOW);
    delay(1);
  } 
  else if (tempreal < tempMin)
  {
    digitalWrite(fan,LOW);
    digitalWrite(led,HIGH);
    delay(1);
  } 
  else if (tempreal >  tempMin && tempreal <  tempMax)   
  {
    digitalWrite(fan,LOW);
    digitalWrite(led,LOW);
    delay(1);
  }
}

Edit by Edgar Bonet – The OP added in a comment to my answer:

«Мен жүйелі түрде оқыдым. Ол сіз күткендей жұмыс істеді бірақ бұл әлі де менің проблемамды шешпейді. Менің сенсорым ғана дұрыс сканерлеудің басындағы мәндер, содан кейін ол өзгереді. Сондықтан Мен орташа мәнді жасағым келді, бірақ ол әлі жұмыс істемейді. Өкінішке орай, менің ойымша Мен сенсорды өзгерте алмаймын, бірақ басқа жол бар бұл мәселені камуфляциялау керек пе? «

Төменде дұрыс (✓) және дұрыс көрсетілмейтін скриншот (✗) оқулары:

Example readings

2

5 жауаптар

Тым қарапайым көрінеді. мен бірдеңе жетіспеймін бе?

--- arithmetic-mean.ino.orig    2017-04-27 19:37:01.386458500 +0200
+++ arithmetic-mean.ino 2017-04-27 19:38:14.458114972 +0200
@@ -16,8 +16,11 @@

 void loop() 
 {
-  temp = analogRead(tempPin);
-  tempreal=temp * 0.48828125;
+  temp = 0;
+  for (int i = 0; i < 5; i++) {
+    temp += analogRead(tempPin);
+  }
+  tempreal = temp * 0.48828125/5;
   delay(1);
   if(tempreal > tempMax)
   {
1
қосылды
Мен сенің айтқандарыңды істедім деп ойладым, бірақ ол әлі де менің проблемамды шешпейді. Менің сенсорым тек сканерлеудің пайда болуында дұрыс мәндерді алады, содан кейін ол өзгереді. Міне, сондықтан орташа мәнді жасауды қаладым, бірақ ол әлі жұмыс істемейді. Өкінішке орай, мен сенсорды өзгерте алмаймын деп ойлаймын, бірақ бұл мәселені камудан басқа жол бар ма? [Сілтеме] prntscr.com/f1kzrv
қосылды автор Richard Haven, көзі
@najkulime: Сонда сіз өзіңіздің сұрағыңызды қайта жазуыңыз керек. Сіз арифметикалық орта туралы сұрадыңыз, бірақ бұл сіз қалаған нәрсе емес: Сіз жарамсыз оқулардан жарамдылығын анықтағыңыз келеді, бұл өте өзгеше сұрақ.
қосылды автор Sprogz, көзі
Аналогты оқудан кейін кішкентай кідірісті қосыңыз. Сериялық портқа жеткен құндылықтарды басып шығара алатыныңызға және бұл туралы бізге көрсетуі пайдалы болар еді.
қосылды автор Al., көзі

Белгіленген сынама терезесі басқаруға қиын болуы мүмкін, әсіресе, егер сіз есептеудің рекурсивті болуын қаласаңыз, ғарыш пен жылдамдықты ескеру үшін.

Экспоненциалды тегістеу арқылы ұқсас нәтижелерге қол жеткізуге болады.

Yn = (1−α) Yn−1 + α Xn

Y n мұнда тегістелген нәтиже болып табылады, X n - бұл өлшеу, ал α - салмақ.

Кейбір ойлармен бүтін сандармен және дәлдікті жоғалтпастан жасауға болады.

Өңдеу: Экспоненциалды тегістеу және қарсы (тұрақты терезе) жылжымалы орта салыстыруын өткіздім. Жылжымалы орташа алгоритм максималды жылдамдық үшін рекурсивті деп жазылған.

іріктелген деректер синусоидалы толқыны болып табылады:

1000 * sin (2pi * n/100) + 100 * шу. n = 0..19999 және шуыл = -0.5 ... + 0.5 болады.

So snr = 1000/50 = 20:1, or about 5 digits. far worse than what you would encounter in a 10-bit adc. enter image description here

Мен таңдаған терезе - 4.

Көріп отырғаныңыздай, екі тәсіл бір біріне ұқсас. экспоненциалды тегістеу әлдеқайда аз қошқарларды қолданады және өте тезірек. ескі деректердің шығудағы салмағы аз, ол көптеген қосымшаларда әдеттегідей пайдалы.

1
қосылды
Сіз ұсынған нәрсеңізді сынап көрдіңіз, бірақ шынайы өлшемдерді тым баяу алсам, тұрақтандыруды бағалау үшін 10-15 секунд қажет. Бұл өте көп көрінеді, бірақ ол өте баяу. сілтеме өңдеуі: мүмкін альфа мәнін өзгерте аламын ба?
қосылды автор Richard Haven, көзі
Егер сіз 5 мәнді орташалап отырсаңыз, жады үлкен мәселе емес. ОС мәселесін орташа есеппен шешу мүмкін емес: жаңартылған сұрақты қараңыз.
қосылды автор Sprogz, көзі

Сіз қозғалыстағы ортаны пайдалана аласыз. Әрбір циклде жаңартылған кезде жаңартылады. N оқылымынан орташа мәнді ме?

double moving_average(double old_average, double new_value) {
    double new_average = old_average;
    new_average -= old_average/N;
    new_average += new_value/N;
    return new_average;
}

Мен жоғарыдағы функцияны редакцияладым. Мен дәлелдердің бірін дұрыс жазған жоқпын.

0
қосылды
Мен кодты түзету үшін бостандығымды алдым, себебі new_average дегенді ұмытып қалдыңыз. « қозғалатын орташа » әдеттегі мағынасы @ DavidJ жауапта келтірілген. Мұнда сіз ұсынатын нәрсе - экспоненталық салмақты қозғалыс орташа мәні. Шын мәнінде @ dannyf-ның жауабын іске асыру. Бірақ ОС мәселесін орташа есеппен шеше алмайтынын ескеріңіз: жаңартылған сұрақты қараңыз.
қосылды автор Sprogz, көзі
Пожалуйста, неге бұл жұмыс істемейді
қосылды автор Alexandru Luchian, көзі
коды жұмыс істемейді, себебі қоңырау екі дәлелмен жасалуы керек пе?
қосылды автор Alexandru Luchian, көзі
ол жұмыс істемейді.
қосылды автор dannyf, көзі
«Неге жұмыс істемейтінін түсіндіріңіз» өте қарапайым: ескі және жаңа код бір проблемадан зардап шегеді - сіз осындай экзогенді ескі қадағалауды қадағалауыңыз қажет. сіз сол жергілікті жасаған боларсыз, сондықтан сіздің кодымен new_value кодын беру керек және ол бір қоңыраумен орташа мән береді.
қосылды автор dannyf, көзі

Менің сенсорым сканерлеудің басында дұрыс мәндерді алады, содан кейін ол өзгереді. Сондықтан орташа мәнді жасауды қаладым, бірақ ол әлі жұмыс істемейді.

Менде осындай проблема болды. Шықты деп жаздым және оқып жүрдім. Бұл дегеніміз, «жұмыс» кезінде оқу мен жазу үзілуі мүмкін дегенді білдіретіндіктен, сіз айнымалыны оқығанда және біреу сіз қоқысты оқып жатқаныңыз туралы жазады. Менің пікірімше, бұл «семафор» немесе «мутахс» қолдану арқылы немесе оқуға шақыруды азайту арқылы белгіленуі мүмкін. Кездейсоқ рет қайталанады, бірақ аз.

Мұнда идеяны таба аласыз https://forum.arduino.cc/index.php?topic=132813.0

Ең жақсы

Джиан Мария

0
қосылды

See Arduino Tutorials Smoothing https://www.arduino.cc/en/tutorial/smoothing

Оқу сабақтарын өткізу үшін массив жасаңыз. Ал соманы ұстап тұратын айнымалы.

Жиым арқылы ұлғайтып, ескі мәнді сомадан алып тастап, оны ағымдағы оқылыммен алапқа ауыстырыңыз. Орташа көрсеткіш санына бөліңіз.

Сенсорға сәйкес келетін әр оқылымның кешігуіне жол бермеңіз.

0
қосылды
Механикалық орта үшін мұнда қажеттілік жоқ: менің жауаптарым бойынша, N оқылымдарын қабылдау оңай және олардың орташа мәнін алуға болады. Бірақ ОС мәселесін орташа есеппен шеше алмайтынын ескеріңіз: жаңартылған сұрақты қараңыз.
қосылды автор Sprogz, көзі