фотодиод и analogread
- Войдите на сайт для отправки комментариев
Сб, 23/03/2013 - 00:06
Доброй всем ночи, Решил вот побаловаться с ардуиной, идея собрать нечто пульс-оксиметра, ардуина должна попеременно мигать светодиодиками, и мерить освещённость фотодиодом с ОУ в фотогальваническом режиме, и вроде бы всё неплохо, только значения скачут, +- 100 и более отсчетов, при этом если поставить переменный резистор, всё нормально и ардуина фиксирует напряжение на нем очень точно, так что грешу на схему. вот код частота считывания около 1000 герц.
#include <LiquidCrystal.h>
// select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
///////////////////////////////////////////////////////////////////////////////////////////
int ledStateRED = LOW; // этой переменной устанавливаем состояние светодиода
int ledStateIR = LOW;
long previousMillis = 0; // храним время последнего переключения светодиода
int ledPinRED =2; // светодиод подключается к digital pin 10
int ledPinIR =3; // IR светодиод подключается к digital pin 11
int photoPin = 2; // фоторезистор подключен 0-му аналоговому входу
long interval=10; //интервал между включениями светодиода
int valRED = 0; // переменная для хранения значения входного напряжения
int valIR = 0; // переменная для хранения значения входного напряжения
/////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
void setup() {
lcd.begin(16, 2); // start the library
lcd.setCursor(0,0);
lcd.print("light intensity"); // print a simple message
Serial.begin(9600);
pinMode(photoPin, INPUT);
pinMode(ledPinRED, OUTPUT);
pinMode(ledPinIR, OUTPUT);
}
void loop()
{
lcd.setCursor(9,1); // move cursor to second line "1" and 9 spaces over
lcd.print(valRED); // display seconds elapsed since power-up
// здесь будет код, который будет работать постоянно
// и который не должен останавливаться на время между переключениями свето
unsigned long currentMillis = millis();
//проверяем не прошел ли нужный интервал, если прошел то
if(currentMillis - previousMillis > interval){
// сохраняем время последнего переключения
previousMillis = currentMillis;
// если светодиод не горит, то зажигаем, и наоборот
if (ledStateRED == LOW){
ledStateRED = HIGH;//взял код из мигания светодиодами без delay
ledStateIR = LOW;//попеременно мигаем то красным то инфракрасным светодиодом
valRED = analogRead(photoPin); //считываем значение с фотодиода при включенном красном
}else
{
ledStateIR = HIGH;//теперь всё наоборот
ledStateRED = LOW;
// analogReference(INTERNAL);
valIR = analogRead(photoPin);}
// устанавливаем состояния выхода, чтобы включить или выключить светодиод
digitalWrite(ledPinRED, ledStateRED);
digitalWrite(ledPinIR, ledStateIR);
Serial.print(valRED);//печатаем значения с фотодиода при включенном красном светодиоде
Serial.print(" ");
Serial.print(valIR);//печатаем значения с фотодиода при включенном инфракрасном светодиоде
Serial.print(" ");
Serial.println(millis());
Serial.println();
}}
фотодиод bpw 34
операционник сдвоенный используется только одна половина lm 358, не может ли быть причина в нем?
Доброй всем ночи, Решил вот побаловаться с ардуиной, идея собрать нечто пульс-оксиметра, ардуина должна попеременно мигать светодиодиками, и мерить освещённость фотодиодом с ОУ в фотогальваническом режиме, и вроде бы всё неплохо, только значения скачут, +- 100 и более отсчетов, при этом если поставить переменный резистор, всё нормально
Согласно скетчу и практической проверке - фоторезистор должен стоять, а не фотодиод.
Здесь http://techdocs.fatal.ru/develop/hardware/komp_izm_komplex/6-4.html
рабоая схема желаемого...
Спасибо за схемку, да переменник я втыкал чтобы проверить всё ли в порядке, с чтением аналоговых сигналов(боялся пин сжёг).
Косяки вылезли когда осцилограф сунул и увидел синусойду с лампы)
Еещё возник вопрос, есть ли простой сполоб находить минимальное значение за последние 100 ну или 500 отсчётов как это делают, со скользящим средним?
пример с этого форума
1mean = 4/5 * mean + 1/5 * val;// скользящее среднее по 5 последним значениям2mean = 99/100 * mean + 1/100 * val;// скользящее среднее по 100 последним значениямЕещё возник вопрос, есть ли простой сполоб находить минимальное значение за последние 100 ну или 500 отсчётов как это делают, со скользящим средним?
int minmin=32767; int maxmax=-32768; while(1) { // получили откуда-то текущее значение и сохранили его в curVal if(maxmax<curVal) maxmax=curVal; if(minmin>curVal) minmin=curVal; }В результате имеете минимальное и максимальное значения за последние стопицотмильёнов циклов.
хм... а почему не используете фототранзистор? (обычно фототранзистор дает как более линейную характеристику, чем фото диод, так и некоторое начальное усиление, которое особенно ценно при большом усилении сигнала для минимизации шумов) соответственно с "подтяжкой " сенсор пина напрямую, или чувствительности нехватает без доп. усиления?
соответственно можно взять 2 одинаковых фототранзистора и подать от них сигналы на дифф входы ОУ. Причем один фототранзистор - рабочий а второй расположен на датчике, рядом с рабочим, всегда затенен и нужен для компенсации помех от первого, и провода. После дифф каскада остается полезная составляющая, которая усиливается вторым каскадом...
Честно говоря, мне просто не удалось найти, подходящий транзистор)
а если в мышке похожий на этот
и еще вот фоторанзистор свими руками http://www.kondratev-v.ru/samodelki/samodelnyj-fototranzistor.html
, и что тут радует это фраза "с большим коэффициентом усиления" только вот канфилью лучше не заливать, а использовать какой нить прозрачный (после отверждения) "момент" или на крайняк суперклей тот же моментовский тонким слоем, чтобы не затемнить, а потом можно вклеить например линзочку из CD привода :)
вообще для pulse-метра надо подбирать спектральнну характеристику излучателя и приемника, чтобы пробивало палец, но не насквозь :), а то реагировать на наполнение кровью капилляров не будет
из мышки вряд ли пойдет, нужно чтобы он примерно одинаково воспринимал и 660 нм и 940нм)
ну и напаял я уже много)
Дурью не майтесь. Купите фоторезистор и подцепите к АЦП.
Что бы палец не пробивало наскрозь, нужно обратную ега сторону чёрным маркером закрасить. :D
оказалость что и в моём коде, какой то косяк.
каждый светодиодик должен гореть допустим 10 милисекунд, а потом на те же 10 миллисекунд выключаться, когда включен один выключен второй, но оказываеться он банально моргает(увеличил задержку до секунды чтоб понять) тоесть при задекжке в одну секунду он горит секунду на мгновенье погасает и снова горит.