Arduino Polska Forum

Pełna wersja: Arduino - wielozadaniowość problem
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
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).
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ć.
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.
https://forum.arduinopolska.pl/watek-bib...iwym-delay Myślę że ten artykuł powinien pomóc
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.
@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..
Jest ktoś w stanie podpowiedź?
Wydaję mi się, że może być jakiś konflikt gotowych bibliotek. Jak wejść w bibliotekę i ją podejrzeć?
Normalnie, znajdź katalog tej biblioteki i nawet otwórz w notatniku pik xx.H i xxx.CCP .. Ale wątpię byś je zrozumiał..
Zacznij od wywalenia delay z funkcji temp i zamiast tego wywołuj ją tak samo jak tę część dla LCD z millis() co 500ms.