Boa noite. É a primeira vez que participo num fórum deste género por isso espero conseguir explicar-me. Desde já agradeço a todos por participarem neste tipo de iniciativa.
Tenho um trabalho em que tenho que fazer a medição da pressão arterial e é a primeira vez que utilizo o arduino, sendo que nunca programei em C, só matlab. Neste caso vai haver transferencia de dados do arduino para o matlab e é no matlab que depois vou tratar os dados.
Na breadboard tenho um sensor de pressão que esta ligado a uma bomba e uma válvula. Quando a bomba e a válvula estão ligados a pressão sobe e quando desligamos a válvula abre e naturalmente a pressão desce. O objectivo é fazer isto com o arduino. O sensor de pressão (que depois é amplificada no AI) liga ao arduino pela porta A0 e da saída digital 13 do arduino para a base de 2 transistores (um para a válvula e o outro para a bomba) irá sair a tensão que vai permitir ligar e desligar o motor e a valvula. O problema é que fazendo:
/*
Communications Matlab <--> Arduino
Arduino file 1 for use with Matlab file 1
L. Toms
establishContact() routine by:
by Tom Igoe and Scott Fitzgerald
other ideas from
robot grrrl
http://robotgrrl.com/blog/2010/01/15/arduino-to-matlab-read-in-sensor-data/
*/
int transistor_Pin = 13;
int AI_Pin = A0;
int nbits = 0;
int nbits_adquiridos = 0;
int nbits_160 = 885 // nota: 875 to 886 (4.27 a 4.33 V) (0 a 160mmHg)); valores que saiem do AI
double t = 0;
double s = 0;
void setup() {
// start serial port at 9600 bps:
Serial.begin(9600);
pinMode(AI_Pin,INPUT);
pinMode(transistor_Pin,OUTPUT);
establishContact(); // send a byte to establish contact until receiver responds
s=millis();
}
void loop() {
nbits = analogRead (AI_Pin);
if (nbits <= nbits_160)
{
digitalWrite(transistor_Pin,HIGH);
}
else
{
digitalWrite(transistor_Pin,LOW);
nbits_adquiridos = analogRead(AI_Pin);
}
t=millis()-s;
Serial.println(t);
Serial.println(nbits_adquiridos);
// o loop vai adquirir infinitamente. mas nos so queremos valores de 160 a 20mmHg!
}
void establishContact() {
while (Serial.available() <= 0) {
Serial.println('A', BYTE); // send a capital A
delay(300);
}
}
No matlab tenho:
% Communications MatLab <--> Arduino
% Matlab file 1 for use with Arduino file 1
clc;
clear all;
numSec=10;
t=[];
v=[];
s1 = serial('/dev/tty.usbmodem641'); % define serial port
s1.BaudRate=9600; % define baud rate
set(s1, 'terminator', 'LF'); % define the terminator for println
fopen(s1);
try % use try catch to ensure fclose
% signal the arduino to start collection
w=fscanf(s1,'%s'); % must define the input % d or %s, etc.
if (w=='A')
display(['Collecting data']);
fprintf(s1,'%s\n','A'); % establishContact just wants
% something in the buffer
end
i=0;
t0=tic;
while (toc(t0)<=numSec)
i=i+1;
t(i)=fscanf(s1,'%f')/1000.;
v(i)=fscanf(s1,'%d'); % must define the input % d, %f, %s, etc.
end
fclose(s1);
plot(t,v,'-r') % another interesting graph
% if you need precise timing
% you better get it from the
% arduino (see file 2) but
% THAT takes time
% down to 60 pts in .7 sec
catch exception
fclose(s1); % always, always want to close s1
throw (exception);
end
O problema também está no ciclo if do arduino, sei que não está bem feito. Porque quando a pressão sobe a cima de 160 (ie, o valor respectivo de tensão) o arduino desliga o motor e a valvula, mas com o diminuir da pressão o arduino vai apanhar um valor de pressao inferior a 160 e entra no ciclo para ligar o motor e a valvula novamente.
Tentei por o digitalWrite(transistor_Pin,HIGH) e digitalWrite(transistor_Pin,LOW) no void setup mas aí só tenho um valor do analogRead e não consigo ter uma leitura no momento.
Tentei dar a volta ao problema fazendo:
int AI_Pin = A0;
int transistor_Pin = 13;
int i = 0;
double t = 0;
double s = 0;
void setup() {
// start serial port at 9600 bps:
Serial.begin(9600);
pinMode(transistor_Pin, OUTPUT);
pinMode(AI_Pin,INPUT);
digitalWrite(transistor_Pin ,HIGH);
delay(5000);
digitalWrite(transistor_Pin,LOW);
establishContact(); // send a byte to establish contact until receiver responds
s=millis();
}
void loop() {
i = analogRead(AI_Pin);
t=millis()-s;
Serial.println(t);
Serial.println(i);
}
void establishContact() {
while (Serial.available() <= 0) {
Serial.println('A', BYTE); // send a capital A
delay(300);
}
}
Porque sei que a tenão demora + - 5 segundos a chegar a uma pressão equivalente de 160, mas não queria fazer assim. De qualquer forma, fazendo o upload no arduino e depois mais tarde correndo o código no matlab, o código é executado 2 vezes, ie, o motor e a bomba começam por trabalhar depois desligam passados 5 segundos e tenho dados no matlab e um gráfico (nada apropriado) e de novo o motor e a bomba começam a trabalhar e depois desligam e aí já não obtenho nenhum gráfico.
Será que alguém me pode ajudar?
É essencial conseguir adquirir os dados para depois os conseguir tratá-los no matlab, e falta pouco tempo para entregar o trabalho. Agradeço muito!!