Arduino (iniciante)

Boa noite. Obrigada pelas respostas à outra questão que submeti mas entretanto consegui resolver o problema. Só que agora tenho outro problema. Vou tentar explicar-me melhor.
Estou a tentar fazer um projecto que dê para medir a pressão arterial (esfigmomanómetro método oscilométrico). na minha breadboar tenho um sensor de pressão, 2 transistores (onde ligam a valvula que está fechada e nao deixa sair ar ou aberta e deixa sair o ar, e o motor que ligado aumenta a pressão), depois tenho um amplificador instrumentação que esta ligado ao arduino e passa os valores de tensao lidos. entretanto pus o arduino a ligar e desligar o motor para conseguir encher ate aos 160mmHg de pressão (que é o normal nos aparelhos a venda).
Fiz o meu código no arduino com o objectivo de comunicar com o matlab (pois o tratamento dos dados é feito no matlab, o arduino so serve de placa de aquisição):

int AI_Pin = A3;
   int motor_Pin = 11;
   int valvula_Pin = 12;
   int i = 0;
   double t = 0;
   double s = 0;
   int nbits_160 = 469;
   
   void setup() {
     
   // start serial port at 9600 bps:
   Serial.begin(115200);
   pinMode(motor_Pin, OUTPUT);
   pinMode(valvula_Pin, OUTPUT);
   pinMode(AI_Pin,INPUT);
   
   
   establishContact();  // send a byte to establish contact until receiver responds
   s=millis();
   digitalWrite(motor_Pin,HIGH);
   digitalWrite(valvula_Pin,HIGH);
   
 }

 void loop() {
 i = analogRead(AI_Pin);
 if (i > nbits_160)
 {
   digitalWrite(motor_Pin,LOW);
 }
 
 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);
     }
 }

E o código no matlab utilizado é:

numSec=60;
t=[];
v=[];

s1 = serial('/dev/tty.usbmodem411');    % define serial port
s1.BaudRate=115200;               % 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  
end

Só que tou a ter um problema. Como eu não sei funcionar mt bem com o arduino, fiz a calibraçao, para saber o valor de tensão que equivale a cada pressão, a partir da placa de aquisição do computador. Então agora os valores parecem não me dar coerentes.
Fiz a calibração manual. Ajustei manualmente a pressão a 180mmHg no manómetro de mercúrio e adquiri 4000amostras e fiz a média dos valores de tensão obtidos para esse valor de pressão, depois para 160mmHg igual e até 20mmHg. O meu código utilizado no matlab foi:

% criação de canal
ai = analoginput('nidaq','Dev1');
chan = addchannel (ai,1);
chan.InputRange = [-5 5];
chan.SensorRange = [-5 5];
chan.UnitsRange = [-5 5];

% escolha da frequência de amostragem (Aps)
ai.SampleRate = 10000;
% escolha do número de amostras adquiridas (tempo de aquisição = 0.4s)
ai.SamplesPerTrigger=4000;


fprintf('Quando a pressão estiver fixa nos 180mmHg escrever 180.\n');
resposta = input('');
if resposta == 180
% pressão 180 mmHg
start(ai);
pause(ai.SamplesPerTrigger/ai.SampleRate);
tensao_180mmHg = getdata(ai);
media_tensao_180 = mean (tensao_180mmHg)
end

fprintf('Quando a pressão estiver fixa nos 160mmHg escrever 160.\n');
resposta = input('');
if resposta == 160
% pressão 160 mmHg
start(ai);
pause(ai.SamplesPerTrigger/ai.SampleRate);
tensao_160mmHg = getdata(ai);
media_tensao_160 = mean (tensao_160mmHg)
end

fprintf('Quando a pressão estiver fixa nos 140mmHg escrever 140.\n');
resposta = input('');
if resposta == 140
% pressão 140 mmHg
start(ai);
pause(ai.SamplesPerTrigger/ai.SampleRate);
tensao_140mmHg = getdata(ai);
media_tensao_140 = mean (tensao_140mmHg)
end

fprintf('Quando a pressão estiver fixa nos 120mmHg escrever 120.\n');
resposta = input('');
if resposta == 120
% pressão 120 mmHg
start(ai);
pause(ai.SamplesPerTrigger/ai.SampleRate);
tensao_120mmHg = getdata(ai);
media_tensao_120 = mean (tensao_120mmHg)
end

fprintf('Quando a pressão estiver fixa nos 100mmHg escrever 100.\n');
resposta = input('');
if resposta == 100
% pressão 100 mmHg
start(ai);
pause(ai.SamplesPerTrigger/ai.SampleRate);
tensao_100mmHg = getdata(ai);
media_tensao_100 = mean (tensao_100mmHg)
end

fprintf('Quando a pressão estiver fixa nos 80mmHg escrever 80.\n');
resposta = input('');
if resposta == 80
% pressão 80 mmHg
start(ai);
pause(ai.SamplesPerTrigger/ai.SampleRate);
tensao_80mmHg = getdata(ai);
media_tensao_80 = mean (tensao_80mmHg)
end

fprintf('Quando a pressão estiver fixa nos 60mmHg escrever 60.\n');
resposta = input('');
if resposta == 60
% pressão 60 mmHg
start(ai);
pause(ai.SamplesPerTrigger/ai.SampleRate);
tensao_60mmHg = getdata(ai);
media_tensao_60 = mean (tensao_60mmHg)
end

fprintf('Quando a pressão estiver fixa nos 40mmHg escrever 40.\n');
resposta = input('');
if resposta == 40
% pressão 40 mmHg
start(ai);
pause(ai.SamplesPerTrigger/ai.SampleRate);
tensao_40mmHg = getdata(ai);
media_tensao_40 = mean (tensao_40mmHg)
end

fprintf('Quando a pressão estiver fixa nos 20mmHg escrever 20.\n');
resposta = input('');
if resposta == 20
% pressão 20 mmHg
start(ai);
pause(ai.SamplesPerTrigger/ai.SampleRate);
tensao_20mmHg = getdata(ai);
media_tensao_20 = mean (tensao_20mmHg)
end


% conjunto de todos os valores de tensão determinados
valores_tensao = [media_tensao_20 media_tensao_40 media_tensao_60 media_tensao_80 media_tensao_100 media_tensao_120 media_tensao_140 media_tensao_160 media_tensao_180];

% calibração feita para valores de pressão de 20mmHg, 40mmHg, 60mmHg...até 180mmH
valores_pressao = 20:20:180;

% determinação dos coeficientes do polinómio de grau 1
coeficientes = polyfit(valores_pressao,valores_tensao,1);

% para todos os valores de pressão de 0 a 180mmHg
todos_valores_pressao = 0:179;

% determinação da recta de calibração
% recta_calibracao = coeficientes(1) * todos_valores_pressao + coeficientes(2);
todos_valores_tensao = polyval(coeficientes,todos_valores_pressao);

% conversão dos valores de tensão para valores inteiros dados pelo arduino
% (apenas para comparação de resultados)
arduino_inteiros = valores_tensao * 1023/5;

% visualização da recta de calibração 
figure(1)
plot(valores_pressao,valores_tensao,'xr')
hold on
plot(todos_valores_pressao,todos_valores_tensao)
xlabel ('Tensão/ V')
ylabel ('Pressão/ mmHg')
title ('Recta de calibração')
hold off

Estes foram os valores de tensão da calibração de 20 a 180mmHg:
0.3958 0.6859 0.9668 1.2514 1.5192 1.7817 2.0308 2.2908 2.5384

E estes os equivalentes inteiros no arduino (para poder depois especificar até quando o motor vai (se reparar no primeiro código tem lá o max tensao a 160mmHg, vem daqui)

80.9882 140.3325 197.8141 256.0396 310.8289 364.5342 415.5096 468.7015 519.3472

depois se a partir dos meus dados adquiridos no arduino (t--> tempo e v --> amplitudes em inteiros), fizer:

max(v) devia dar 468.7015 mas dá 486 e por isso tenho um valor de tensão também diferente (2.3754), que equivale a uma pressão superior a 160mmHg de acordo com a recta de calibração. Não sei porque isto acontece, será pela freq. aquisição ser diferente no arduino e na placa?

Isto depois influencia-me nos valores seguintes e por isso gostava de fazer a calibração no arduino, utilizando na mesma aquele esquema de mandar para o matlab os dados, para ficar lá com os valores.

Alguém me sabe dizer como podia fazer isto no arduino? é que tenho sempre que fixar o valor manual no manómetro e o loop do arduino não pára :s
mt obrigada!!
Desculpem o longo texto!

Tente a função map();

http://arduino.cc/en/Reference/Map

aquele código que passei não funcionou?

vc poderia também programar o arduino como máquina finita;

http://www.isisconceptuallaboratory.com/teaching/Sm[Art]%20Spaces/fsm.pdf

Qual código?

obrigada por responder!

Este:

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() {
    t=millis()-s;
 
    do {
       digitalWrite(transistor_Pin,HIGH);
       nbits = analogRead (AI_Pin);
       Serial.println(t); 
       Serial.println(nbits);
       
    }
     while (nbits < nbits_160);
       
  if (nbits >=nbits_160){
     digitalWrite(transistor_Pin,LOW);//desligar a bomba e a valvula.
    while(1); //fazer nada.
  }

ah sim:) eu já resolvi esse meu problema. fiz:

int AI_Pin = A3;
   int motor_Pin = 11;
   int valvula_Pin = 12;
   int i = 0;
   double t = 0;
   double s = 0;
   int nbits_160 = 469;
   
   void setup() {
     
   // start serial port at 9600 bps:
   Serial.begin(115200);
   pinMode(motor_Pin, OUTPUT);
   pinMode(valvula_Pin, OUTPUT);
   pinMode(AI_Pin,INPUT);
   
   
   establishContact();  // send a byte to establish contact until receiver responds
   s=millis();
   digitalWrite(motor_Pin,HIGH);
   digitalWrite(valvula_Pin,HIGH);
   
 }

 void loop() {
 i = analogRead(AI_Pin);
 if (i > nbits_160)
 {
   digitalWrite(motor_Pin,LOW);
 }
 
 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);
     }
 }

agora queria fazer exactamente o que fiz na placa de aquisição mas no arduino só que não sei fazer aquele comando input ' ' que tenho no matlab no arduino, ie, mandar do arduino para o matlab, responder lá e mandar de novo para o arduino. depois adquirir os dados e enviar os dados para o matlab através daquela parte do código:

void establishContact() {
     while (Serial.available() <= 0) {
       Serial.println('A', BYTE);   // send a capital A
       delay(300);
     }
}

Não conheço Matlab, mas vi que vc precisa instalar o MATLAB Support Package for Arduino. Também achei um tutorial muito bom aqui:

Espero ter ajudado.

obrigada! se entretanto alguém souber mais alguma coisa..:s