• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino - wielozadaniowość problem
#1
Witam,
Jestem laikiem jeśli chodzi o Arduino. Chciałbym zrobić sobie większy projekt, a mianowicie monitor oddechu. Niestety na samym starcie już nie mogę sobie poradzić. Początkowym założeniem mojego projektu jest wykrycie bezdechu, a więc posłużyłem się pulsoksymetrem MAX30100 oraz termoparą MAX6675. Pulsoksymetr mierzy puls( który można zaobserwować na wyświetlaczu), a termopara temperaturę(można ją podejrzeć w porcie szeregowym), która jest przy nosie ( wysoka temp = wydech, niska temp = wdech), w momencie wykrycia stałej temp np przez 20s i słabszego pulsu, ma się coś działać wibracja/sygnał itp. ( późniejsza faza projektu)

Mam problem z kodem, który jest następujący :
  
#include <LiquidCrystal.h>
#include <Wire.h>

#include "MAX30100_PulseOximeter.h"

#define OKRES_WYSWIETLANIA 200

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);   

uint8_t saturacja;

float tetno;

PulseOximeter max30100;

uint32_t poprzedniOdczyt = 0;

#include "max6675.h"



int ktcSO = 36;

int ktcCS = 37;

int ktcCLK = 38;



MAX6675 ktc(ktcCLK, ktcCS, ktcSO);



void setup() {

    Serial.begin(9600);

   

  lcd.begin(16,2);

  lcd.setCursor(0,0);

  max30100.begin();

  max30100.setIRLedCurrent(MAX30100_LED_CURR_11MA); //ustawienie pradu diody podczerwonej

}



void loop() {

  puls();

  temp();

}



void puls(){

max30100.update();

  if (millis() - poprzedniOdczyt > OKRES_WYSWIETLANIA) {

    saturacja = max30100.getSpO2();

    tetno = max30100.getHeartRate();

    lcd.clear();

    lcd.setCursor(0,0);

    lcd.print("Tetno: ");

    lcd.print(tetno);

    lcd.print(" bpm");

    lcd.setCursor(0,1);

    lcd.print("Saturacja: ");

    lcd.print(saturacja);

    lcd.print("%");

    poprzedniOdczyt = millis();

  }

}



void temp(){

    Serial.print("Deg C = ");

  Serial.print(ktc.readCelsius());

  Serial.print("\t Deg F = ");

  Serial.println(ktc.readFahrenheit());



  delay(500);
}




Pulsoksymetr działa, jeśli wywołanie funkcji temperatury jest za komentowane i na odwrót.
Moje pytanie brzmi, jak sobie z tym poradzić, żeby zarówno pulsoksymetr jak i termopara działa w tym samym czasie (równolegle/współbieżnie).
 
Odpowiedź
#2
Możesz jakoś lepiej opisać, na czym polega problem?
Bo oczywiście program działa.
Być może nie działa, tak jakbyś sobie tego życzył, ale na pewno działa tak, jak został napisany. Opisz więc jak on aktualnie działa, oraz jak byś chciał aby działał.
Druga sprawa, to nie ma czegoś takiego jak współbieżne działanie dwóch funkcji. Albo działa jedna, albo druga.
Nie możesz jednocześnie jechać tym samym samochodem do Gdańska i do Zakopanego.
Uwierz, mimo słabiutkiego rdzenia, ten procesor potrafi tak szybko przelecieć przez te funkcje, że nie byłbyś w stanie zauważyć, że nie pracują równolegle, tylko naprzemiennie. Musisz mu tylko przestać przeszkadzać.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#3
Gdy wgrywam powyższy kod, to działa tylko termopara, której wyniki można podejrzeć w porcie szeregowym, zaś na wyświetlaczu nic się nie zmienia tętno i saturacja wskazuję ciągle 0, jakbym po prostu palca nie przykładał. W momencie za komentowania funkcji TEMPeratury na wyświetlaczu zmieniają się liczby i widać prawidłowy puls.
 
Odpowiedź
#4
https://forum.arduinopolska.pl/watek-bib...iwym-delay Myślę że ten artykuł powinien pomóc
 
Odpowiedź
#5
Ja ostatnio pracuję z https://github.com/arkhipenko/TaskScheduler i jestem bardzo zadowolony, prawie jak RtOS, tylko nie zjada pamięci. Polecam gorąco. Biblioteka porządnie opisana.
A nad problemem pochylę się wieczorem, jak znajdę chwilkę czasu.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#6
@kasilos dzięki za artykuł, wprowadziłem zmiany w kodzie na tyle ile go zrozumiałem, lecz niestety to nie pomogło :/

Dodałem w void loop warunek :

if ( tetno >60 && saturacja > 80){
temp();

I w tym momencie mierzy puls, jesli jest mniejszy<60 to nadal mierzy puls i temp oczywiście nie startuje, jeśli tetno spelnia warunek, momentalnie tetno na wyswietlaczu nie zmienia wartosci i startuje temp tak jak powinna.

+ próbowałem to zapętlić while (;Wink bądź for'em na kilka iteracji ale to nic nie daje..
 
Odpowiedź
#7
Jest ktoś w stanie podpowiedź?
Wydaję mi się, że może być jakiś konflikt gotowych bibliotek. Jak wejść w bibliotekę i ją podejrzeć?
 
Odpowiedź
#8
Normalnie, znajdź katalog tej biblioteki i nawet otwórz w notatniku pik xx.H i xxx.CCP .. Ale wątpię byś je zrozumiał..
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#9
Zacznij od wywalenia delay z funkcji temp i zamiast tego wywołuj ją tak samo jak tę część dla LCD z millis() co 500ms.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości