Обработка аналогово сигнала
- Войдите на сайт для отправки комментариев
Пт, 10/04/2015 - 18:06
Здраствуйте друзья! Хотел поинтересоваться у вас, замеряю влажность почвы с помощью вот этого устройства 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 значения и вывожу среднеарифмитическое а там уже от значения что то делаю.
Нужно ли что нибудь изменить в моем алгоритме или все ок?
Ты его питаешь от ардуино?)
StanHD, в вашем алгоритме вообще ничего не ок. Вы три раза суммируете результат одного и того-же измерения analogRead.
Сейчас да, но вообще хочу переделать под реле, чтобы срабатывало раз в день секунд на 10.
Хотите сказать в дополнительные переменные записываются одни и те же значения?
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мА, на что питать его от ардуино не советую.
Так лучше будет?
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, да, так лучше. Но обычно это делается так:
int checkSoil_moisture() { val_soilHum=0; for (byte n=3; n!=0 ; n--){ val_soilHum+=analogRead(A0); delay(100); } val_soilHum/=3; }val_soilHum объявлена глобально так как я к ней обращаюсь из других мест потом. А Цикл не повлияет на быстродействие? И почему в цикле byte?
StanHD, на быстродействие влияет только ваши delay(), я сразу не стал писать, тут задержки ничего не улучшат. Гораздо полезней вместо задержек увеличить число отсчётов, скажем до 256. Только придётся объявить переменную val_soilHum как long. Byte в цикле потому что счёт цикла умещается в один байт (0..255) . Если циклов будет более 255 -то нужно искользовать переменную int.
Странно у той приблуды что по ссылке активный дискретный выход и смысл его на аналог садить.
Если на дискретный посадить то только значения 0 или 1 получать буду?