Bonjour,
Merci pour tout vos retours. L'option avec deux boutons poussoirs fonctionnent parfaitement.
Je vais donc rester sur cette méthode.
J'ai modifier le code afin de l'alléger et de le comprendre un peu plus. Comme dit plus haut, il fonctionne. Cela dit, je serais intéresser par toute remarque qui pourrait le rendre encore plus optimisé.
#define ENABLE_CUSTOM_WAVE
#define ENABLE_RESP_SIM
#define ENABLE_RESP_LED
#define F_CPU 16000000UL
#define BOUTON_PLUS 2
#define BOUTON_MOINS 3
#define PINOUT 9
#define RESP 10
#define RESP_LED 13
int MODE = 0;
#include "wave.h"
#include <string.h>
//Définition de la variable hr_rate et de ses valeurs.
enum hr_rate {
BPM40 = 0x3C, //60
BPM80 = 0x1E, //30
BPM120 = 0x14, //20
TACH = 0xF, //15
};
//Définition de la variable resp_rate et de ses valeurs.
enum resp_rate {
RESP12 = 150,
RESP38 = 50
};
uint8_t nsr_fragment[] = {
35, 38, 35, 20, 20, 20, 25, 5,
140, 255, 0, 20, 20, 20, 25,
35, 45, 55, 58, 56, 25
};
uint8_t pwm_vtach[0x10] { //16
0, 100, 150, 200, 220, 240, 250, 240,
255, 210, 180, 140, 100, 80, 40, 10,
};
uint8_t pwm_norm_sr[0x40]; //64
uint8_t pwm_vfib[0x40]; //64
uint8_t custom_wave[0x40]; //64
void disable_resp(void) { //Désactivation de la fréquence respiratoire
DDRB = DDRB | 0x4;
TCCR2B = 0;
}
void enable_resp(void) { //Désactivation de la fréquence respiratoire
TCCR2B = 0x7;
}
void (*resp_enable_fp)(void) = enable_resp;
void __attribute__((always_inline)) pwm_dc(const uint8_t duty_cycle) {
OCR1A = duty_cycle;
}
void __attribute__((hot)) pwm_array_sequence(const uint8_t *const sequence_array, const uint8_t rate) { //Création du signal Fréquance Cardiaque
static uint8_t counter;
uint8_t value = sequence_array[counter];
counter = (counter + 1) % rate;
pwm_dc(value);
PORTD = PORTD & ~0x20;
if(value == 255)
PORTD = PORTD | (1 << PD5);
}
static long resp_rate = RESP12; //Création du siganl Fréquence Respiratoire
ISR(TIMER2_OVF_vect) {
static uint8_t counter = 0;
counter = (counter + 1) % resp_rate;
if(counter == 0) {
DDRB = DDRB ^ 0x4;
PORTB = PORTB & ~0x4;
PORTB = (PORTB ^ 0x20);
}
}
void setup(void) {
pinMode(BOUTON_PLUS, INPUT_PULLUP);
pinMode(BOUTON_MOINS, INPUT_PULLUP);
pinMode(5, OUTPUT);
pinMode(RESP, OUTPUT);
pinMode(RESP_LED, OUTPUT);
pinMode(PINOUT, OUTPUT);
Serial.begin(9600);
cli();
TCCR1A |= _BV(COM1A1) | _BV(WGM10);
TCCR1B |= _BV(CS10) | _BV(WGM12);
TCCR2A = 0;
enable_resp();
TCNT2 = 0;
TIMSK2 = _BV(TOIE2);
sei();
for(uint8_t i = 0; i < sizeof(pwm_vfib); i++)
pwm_vfib[i] = (50 * (sin(i / 3) * sin((i / 3) * 2))) + 50;
for(uint8_t i = 0; i < sizeof(pwm_norm_sr); i++)
pwm_norm_sr[i] = 20;
for(uint8_t i = 0; i < sizeof(nsr_fragment); i++)
pwm_norm_sr[i] = nsr_fragment[i];
for(uint8_t i = 0; i < sizeof(custom_wave); i++)
custom_wave[i] = extern_baseline;
uint8_t bcount = sizeof(extern_wave_fragment);
if(bcount > sizeof(custom_wave))
bcount = sizeof(custom_wave);
memcpy(custom_wave, extern_wave_fragment, bcount);
}
void __attribute__((hot)) loop(void) {
uint8_t *current_sequence = pwm_norm_sr;
uint8_t heart_rate = BPM80;
uint8_t master_delay = 25;
while(1) {
boolean ETAT_BOUTON_PLUS = digitalRead(BOUTON_PLUS);
boolean ETAT_BOUTON_MOINS = digitalRead(BOUTON_MOINS);
if (ETAT_BOUTON_PLUS == LOW) {
MODE = (MODE + 1) % 8;
Serial.println("Mode actuel : " + String(MODE));
delay(200);}
else if (ETAT_BOUTON_MOINS == LOW) {
MODE = (MODE - 1 + 8) % 8;
Serial.println("Mode actuel : " + String(MODE));
delay(200);}
pwm_array_sequence(current_sequence, heart_rate);
current_sequence = pwm_norm_sr;
heart_rate = BPM80;
resp_rate = RESP12;
resp_enable_fp();
switch(MODE) {
case 0: // normal sinus rhythm, 80BPM
break;
case 1: // normal sinus rhythm, 40BPM
heart_rate = BPM40;
break;
case 2: // normal sinus rhythm, 120BPM
heart_rate = BPM120;
break;
case 3: // normal sinus rhythm, tach
heart_rate = TACH;
break;
case 4: // normal sinus rhythm, bpm80, apnea
heart_rate = BPM80;
disable_resp();
break;
case 5: // normal sinus rhythm, bpm80, hyperventilation
resp_rate = RESP38;
break;
case 6: // V-tach
current_sequence = pwm_vtach;
heart_rate = TACH;
resp_rate = RESP38;
break;
case 7: // V-fib
disable_resp();
current_sequence = custom_wave;
break;
}
delay(master_delay);
}
}
Plus tard, à la place du moniteur série, j'inclurai un écran LCD pour indiquer le nom et le numéro du programme.
Merci.