Обработка аналогово сигнала

StanHD
Offline
Зарегистрирован: 18.09.2014

Здраствуйте друзья! Хотел поинтересоваться у вас, замеряю влажность почвы с помощью вот этого устройства http://krsk.24au.ru/4159735/ -Датчик влажности почвы. Подключен значит он к аналоговому входу Arduino. Нужно ли как то обрабатывать этот сигнал? Я этот сигнал обрабатываю так:
 

int checkSoil_moisture()
{
	int average_value1 = 0;
	int average_value2 = 0;
	int average_value3 = 0; 
	
	val_soilHum = analogRead(0);
	average_value1 = val_soilHum;
	delay(100);
	average_value2 = val_soilHum;
	delay(100);
	average_value3 = val_soilHum;
	val_soilHum = (average_value1+average_value2+average_value3)/(3);
	
	
}

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

Marlen S
Offline
Зарегистрирован: 13.01.2015

Ты его питаешь от ардуино?) 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

StanHD, в вашем алгоритме вообще ничего не ок. Вы три раза суммируете результат одного и того-же измерения analogRead.

StanHD
Offline
Зарегистрирован: 18.09.2014

Сейчас да, но вообще хочу переделать под реле, чтобы срабатывало раз в день секунд на 10.

StanHD
Offline
Зарегистрирован: 18.09.2014

Хотите сказать в дополнительные переменные записываются одни и те же значения?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

StanHD, да, одни и  те-же. Вы перекладываете во все свои переменные одно и то-же значение.

Marlen S
Offline
Зарегистрирован: 13.01.2015

StanHD пишет:

Здраствуйте друзья! Хотел поинтересоваться у вас, замеряю влажность почвы с помощью вот этого устройства http://krsk.24au.ru/4159735/ -Датчик влажности почвы. Подключен значит он к аналоговому входу Arduino. Нужно ли как то обрабатывать этот сигнал? Я этот сигнал обрабатываю так:
}

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

int SensorHum = A0;  
int Hvcc = 7;      // Ключ питание сенсора влажности почвы
int currentHum = 0; //текущее значение Hum
int lastHum = 0; //предыдущее значение Hum

int meteringCounter = 0; //счетчик измерений
int meteringAmount = 10; //сколько раз мерять
long meteringInterval = 100; //интервал измерений
long previousMillis_2 = 0; 

long previousMillis_3 = 0; 
long IntervalMillis = 2000;    // Указать время на интервал опроса 

void setup(){
  Serial.begin(9600);
  pinMode(Hvcc, OUTPUT); 
  digitalWrite(Hvcc, LOW);
}
int tempHum = 0; //временная переменная
void loop(){
  unsigned long currentMillis = millis();
  if((currentMillis - previousMillis_2 >= meteringInterval) && meteringCounter < meteringAmount){
    meteringCounter++; //прибавляем счетчик
    previousMillis_2 = currentMillis;
    digitalWrite(Hvcc, HIGH);
    tempHum += analogRead(SensorHum);  
  } else if(meteringCounter==meteringAmount){ //проверяем если достигли конца счетчика
    meteringCounter=0; //сбрасываем счетчик в 0
    lastHum = currentHum; //присваиваем предыдущему значению Hum текущее значение Hum
    currentHum = tempHum/meteringAmount; //обновляем текущее значение (делим временную переменную на кол-во измерений)
    tempHum=0; //сбрасываем временную переменную в 0
   digitalWrite(Hvcc, LOW);
  }
  //Выводим значение в Serial если прошло 2 секунды и текущее значение Hum не равно предыдущему значению Hum
  if((currentMillis - previousMillis_3 >= IntervalMillis) && currentHum != lastHum)
  {
    previousMillis_3 = currentMillis;
    Serial.print("currentHum=");
    Serial.println(currentHum);
  }
}

Вот. Написал это "2009Shef" за что ему большое Спасибо! 

Кстати на замере тока этот датчик показал у меня 170мА, на что питать его от ардуино не советую.

StanHD
Offline
Зарегистрирован: 18.09.2014

Так лучше будет?

int checkSoil_moisture()
{
    int average_value1 = 0;
    int average_value2 = 0;
    int average_value3 = 0;
     
    average_value1 = analogRead(0);
    delay(100);
    average_value2 = analogRead(0);
    delay(100);
    average_value3 = analogRead(0);
    delay(100);
  
    val_soilHum = (average_value1+average_value2+average_value3)/(3);
     
     
}

 

StanHD
Offline
Зарегистрирован: 18.09.2014

Спасибо большое, сейчас буду разбираться!

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

StanHD, да, так лучше. Но обычно это делается так:

int checkSoil_moisture() {
   val_soilHum=0;
   for (byte n=3; n!=0 ; n--){
   val_soilHum+=analogRead(A0);
   delay(100); }
    val_soilHum/=3;
}

 

 

 

StanHD
Offline
Зарегистрирован: 18.09.2014

val_soilHum объявлена глобально так как я к ней обращаюсь из других мест потом. А Цикл не повлияет на быстродействие? И почему в цикле byte?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

StanHD, на быстродействие влияет только ваши delay(), я сразу не стал писать, тут задержки ничего не улучшат. Гораздо полезней вместо задержек увеличить число отсчётов, скажем до 256. Только придётся объявить переменную val_soilHum как long. Byte в цикле потому что счёт цикла умещается в один байт (0..255) . Если циклов будет более 255 -то нужно искользовать переменную int.

vov4ik
Offline
Зарегистрирован: 10.09.2013

Странно у той приблуды что по ссылке активный дискретный выход и смысл его на аналог садить.

StanHD
Offline
Зарегистрирован: 18.09.2014

Если на дискретный посадить то только значения 0 или 1 получать буду?