Оксиметр

goha92
Offline
Зарегистрирован: 20.03.2013

Здравствуйте,

Всё мучаюсь с дипломом.

Суть такова, ардуино светит то красным, то инфракрасным светодиодом с равными интервалами времени(), эти светодиоды светят через палец на фотодиод-палец в защищенном от света напальчнике.

По идее, таким образом можно засечь кровоток и определить содержание кислорода в крови, но сигнал на выходе, совсем не похож на ожидаемый, лезут лютые помехи.

#define ledPinRED 2   // светодиод подключается к digital pin 2
#define ledPinIR 3   // IR светодиод подключается к digital pin 3
#define photoPin 2  // фотодиод подключен 2-му аналоговому входу

long previousMillis = 0;        // храним время последнего переключения светодиода
long interval = 1; //интервал между включениями светодиода
int valRED = 0;       // переменная для хранения значения входного напряжения
int valIR = 0;       // переменная для хранения значения входного напряжения
/////////////////////////////////////////////////////////     

////////////////////////////////////////////////////////////////////////    
void setup() 
{
  Serial.begin(115200);
  pinMode(ledPinRED, OUTPUT); 
  pinMode(ledPinIR, OUTPUT);  
}

void loop()
{
  //проверяем не прошел ли нужный интервал, если прошел то
  if(millis() - previousMillis > interval)
  {
    static bool state;
    state = !state;
    if(state)
    {
      digitalWrite(ledPinRED, HIGH);//взял код из мигания светодиодами без delay
      digitalWrite(ledPinIR, LOW);//попеременно мигаем то красным то инфракрасным светодиодом
      // analogReference(INTERNAL);
      valRED = analogRead(photoPin);//считываем значение с фотодиода при включенном красном
    }
    else
    { 
      digitalWrite(ledPinRED, LOW);
      digitalWrite(ledPinIR, HIGH);//теперь всё наоборот
     //analogReference(INTERNAL);
      valIR = analogRead(photoPin);//считываем значение с фотодиода при включенном ик светодиоде
    }
    
    Serial.print(valRED);//печатаем значения с фотодиода при включенном красном светодиоде
    Serial.print(" ");
    Serial.print(valIR);//печатаем значения с фотодиода при включенном инфракрасном светодиоде
    Serial.print(" ");
    Serial.println(millis());//печатаем время
    Serial.println();
    // сохраняем время последнего переключения
    previousMillis = millis(); 
  }
}

ourlive
Offline
Зарегистрирован: 26.05.2012

http://arduino.ru/Tutorial/Arduino_Interrupts

Читайте тему прерываний для начала. А ещё analogRead() очень не шустрая штука, настолько же не шустрая, как нестабильная millis(). Потому каждый проход кода у вас "как повезёт", рассинхронизация может быть в 2-3 раза. А вы ещё и в serial данные печатаете, который вообще в основе своей асинхронный, и будет работатьпроизвольное время. Приведите листинг из serial.

goha92
Offline
Зарегистрирован: 20.03.2013
7 11 15874

7 22 15876

4 22 15878

4 21 15880

3 21 15882

3 21 15884

4 21 15886

4 19 15888

157 19 15890

157 52 15892

5 52 15894

5 21 15896

5 21 15898

5 22 15900

2 22 15902

2 21 15904

6 21 15906

6 21 15908

159 21 15910

159 11 15912

7 11 15915

7 22 15917

2 22 15919

2 24 15921

3 24 15923

3 20 15925

6 20 15927

6 20 15929

53 20 15931

53 12 15933

6 12 15935

6 22 15937

3 22 15939

3 22 15941

4 22 15943

4 28 15945

63 28 15947

63 11 15949

126 11 15951

126 49 15953

5 49 15955

5 25 15958

3 25 15960

3 23 15962

4 23 15964

4 31 15966

27 31 15968

27 11 15970

24 11 15972

24 11 15974

4 11 15976

4 22 15978

3 22 15980

3 22 15982

5 22 15984

5 21 15986

144 21 15988

144 52 15990

7 52 15992

7 23 15994

4 23 15996

4 24 15998

3 24 16000

3 23 16002

5 23 16004

5 13 16006

144 13 16008

144 29 16010

33 29 16012

33 33 16014

4 33 16016

4 13 16018

3 13 16020

3 13 16022

4 13 16024

4 13 16026

37 13 16028

37 37 16030

8 37 16032

8 12 16034

4 12 16036

4 12 16038

3 12 16040

3 13 16043

5 13 16045

5 11 16047

114 11 16049

114 31 16051

8 31 16053

8 11 16055

5 11 16057

5 12 16059

2 12 16061

2 13 16063

6 13 16065

6 11 16067

257 11 16069

257 33 16071

7 33 16073

7 17 16075

3 17 16077

3 29 16079

3 29 16081

3 25 16083

8 25 16086

8 24 16088

11 24 16090

11 37 16092

6 37 16094

6 13 16096

3 13 16098

3 13 16100

3 13 16102

3 13 16104

18 13 16106

18 35 16108

55 35 16110

55 45 16112

7 45 16114

7 13 16116

4 13 16118

4 18 16120

3 18 16122

3 31 16124

5 31 16126

5 12 16128

297 12 16130

297 37 16132

6 37 16134

6 12 16136

5 12 16138

5 14 16140

3 14 16142

3 13 16144

5 13 16146

5 12 16148

73 12 16150

73 48 16152

7 48 16154

7 19 16156

3 19 16158

3 19 16160

3 19 16162

3 26 16164

6 26 16166

6 27 16168

753 27 16171

753 18 16173

5 18 16175

5 14 16177

2 14 16179

2 13 16181

3 13 16183

3 14 16185

4 14 16187

4 12 16189

8 12 16191

8 12 16193

4 12 16195

4 14 16197

3 14 16199

3 19 16201

2 19 16203

2 32 16205

667 32 16207

667 18 16209

10 18 16211

10 40 16214

6 40 16216

6 14 16218

3 14 16220

3 14 16222

5 14 16224

5 11 16226

10 11 16228

10 39 16230

9 39 16232

9 20 16234

10 20 16236

10 20 16238

3 20 16240

3 13 16242

5 13 16244

5 12 16246

26 12 16248

26 36 16250

14 36 16252

14 40 16254

6 40 16256

6 47 16258

3 47 16260

3 30 16262

5 30 16264

5 33 16266

175 33 16268

175 11 16270

426 11 16272

426 19 16274

5 19 16276

5 19 16278

3 19 16280

3 29 16282

4 29 16284

4 27 16286

547 27 16288

547 20 16290

9 20 16292

9 19 16294

5 19 16296

5 20 16299

3 20 16301

 

ourlive
Offline
Зарегистрирован: 26.05.2012

измените интервал с 1 милисекунды на 1 секунду (или даже более). если снова ничего не получится, проведите измерения аналоговыми приборами (для проверки исправности детекторного блока). если я правильно понял, то смысл в измерении светопоглащения, и скорость тут не важна.

(+) аналогреад очень некорректно мерит быстроменяющиеся величины, светодиод не может зажечься мгновенно, у вас он еще на переднем фронте зажигания, а вы уже пытаетесь мерить, корректируйте код в эту сторону.

goha92
Offline
Зарегистрирован: 20.03.2013

Нет, к сожалению нужно мигать с частотой минимум герц 100(
А вообще чудеса какие то: сейчас сделал чтоб горел один светодиод постоянно, и вот что получилось:когда пальца в датчике нет на осцилографе постоянный уровень, но когда пихаю палец какие-то блин шумы, или же полезный сигнал, но частоты слишком высоки для полезного, буду ещё колдовать, фильтр приделаю гляну что произойдет.
спасибо за помощь)

peet
Offline
Зарегистрирован: 12.05.2013

Еще проверь схему   чтото не нравится мне логика подключения фотодиода к   операционнику   ...      помойму нехватает подтягивающего резистора 

goha92
Offline
Зарегистрирован: 20.03.2013

не он норм подключен,
проблема, как оказалась была в наводках с компьютерафильтр и экранированный кабель исправили ситуацию)

Ya163
Offline
Зарегистрирован: 26.05.2015

Автор. Помогите мне пожалуйста с написанием диплома. Тема аналогичная.

Гриша
Offline
Зарегистрирован: 27.04.2014

Ya163 пишет:

Автор. Помогите мне пожалуйста с написанием диплома. Тема аналогичная.

ЗЫ схема не рабочая :) (просто нарисована с огромной ошибкой)

Ya163
Offline
Зарегистрирован: 26.05.2015

Спасибо, не обратил внимания на схему включения операционных усилителей. На вход подается не понятное.

Гриша
Offline
Зарегистрирован: 27.04.2014

Ya163 пишет:

Спасибо, не обратил внимания на схему включения операционных усилителей. На вход подается не понятное.

точно, ОУ1 вообще не в режиме, да и подстроечник в обратной связи мягко говоря антенна. Можно еще найти косяки, при желании.

Богдан
Offline
Зарегистрирован: 27.05.2015

есть ли у вас рабочая схема??

Гриша
Offline
Зарегистрирован: 27.04.2014

Богдан пишет:

есть ли у вас рабочая схема??

нету т.к. непонятен алгоритм... точнее в голове есть 2 варианта схемы, но их необходимо макетировать. Строго говоря - схемы самые обыкновенные - инвертирующий и неинвертирующий ОУ с ФД на входе.  Там и без этого, ошибок много...

tarasui
Offline
Зарегистрирован: 29.01.2016

А как собрать Оксиметр для воды ?