Commit fc78bc1c authored by Béuren F. Bechlin's avatar Béuren F. Bechlin

Primeira versão do respirômetro com as duas narinas, estimando a frequência...

Primeira versão do respirômetro com as duas narinas, estimando a frequência respiratória e tendo como saída um arquivo .png também ajustado bug para encontrar a frequência do arduino

Conflicts:
	python/visualiza_new.py
parent beff648d
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Estação biométrica CTA
#
# Programa para estimar a frequência respiratória
# Este programa é utilizado em conjunto com armazenamento de dados, onde nessa etapa é utilizado os dados para realizar a Trans. de Fourier para estimar frequência respiratória.
#
# Centro de Tecnologia Acadêmica - UFRGS
# http://cta.if.ufrgs.br
#
# Licença: GPL v3
# Ordem de argumentos : [arquivo_de_dados]
# Onde:
# [arquivo_de_dados]: nome do arquivo que foram salvos os dados
# Exemplo: python armazenamento.py '/dev/ttyACM0' 115200 coleta1.log
from scipy.fftpack import fft, fftfreq, fftshift
import matplotlib.pyplot as plt
import numpy as np
import sys
print "---- Programa para estimar a frequência respiratória ---- "
print " Selecionar a quantidade de dados: "
t_inicial = input('Instante inicial (em segundos): ')
t_final = input('Instante final (em segundos): ')
fisiologfile = open(sys.argv[1],'r')
freq = float(fisiologfile.readline().replace('\n', '').split('\t')[1])
cont_ini = t_inicial*freq
cont_final = t_final*freq
y[]
i = -3 # USANDO 3 LINHAS DE COMENTÁRIO NO ARQUIVO
for line in fisiologfile:
i ++
if(i > cont_ini and i <= cont_final):
y.append(int(line))
# Número de sinais coletados
N = cont_final - cont_ini
# Espaçamento padrão
T = 1.0 / freq
# Eixo X
x = np.linspace(0.0, N*T, N)
# Transformadas
yf = fft(y)
xf = fftfreq(N, T)
xplot = fftshift(xf)
yplot = fftshift(yf)
xplot = xplot[N/2:N]
yplot = np.abs(yplot[N/2:N])
# Filtro cúbico de dados (Pensar se deve ser normalizado apartir do maior valor)
y_filtrado = yplot*yplot*yplot
flag = 1
for i in xrange(0, N/2):
if xplot[i] > 0.3 and flag == 1:
ini = i
flag = 0
if xplot[i] > 1:
fim = i
break
# Integral
soma_int = 0
soma_norma = 0
dx = freq / N
for i in xrange(ini, fim):
aux = y_filtrado[i]*dx
soma_int += aux*xplot[i]
soma_norma + = aux
first_moment = soma_int / soma_norma
print first_moment
# Plot
plt.subplot(211)
plt.plot(x, y)
plt.subplot(212)
plt.plot(xplot, (1.0/N) * yplot)
plt.grid()
plt.show()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Estação biométrica CTA
#
# Programa para aquisição dos dados
# Este programa é utilizado com o programa biometrica.ino no qual a taxa de amostragem é definida no microcontrolador
#
# Protocolo usado está disponível no biométrica.ino
#
# Centro de Tecnologia Acadêmica - UFRGS
# http://cta.if.ufrgs.br
#
# Licença: GPL v3
# Ordem de argumentos : [porta],[taxa_transmissão],[arquivo_saída]
# Onde
# [porta]: porta serial no qual o arduino está conectado
# [taxa_transmissão]: velocidade de comunicação serial
# [tempo_de_execução]: tempo total de execução, em segundos
# [arquivo_saída]: nome do arquivo em que os dados serão salvos
# Exemplo: python armazenamento.py '/dev/ttyACM0' 115200 coleta1.log 30
import sys, time, serial, datetime
argumento = sys.argv[1:] #renomeando os argumentos
# Iniciando comunicação serial
ser = serial.Serial(argumento[0], argumento[1])
# Limpando buffer para retirar as medidas feitas antes de iniciar o software
ser.setDTR(False) # Desliga DTR
time.sleep(0.005)
ser.flushInput() # Limpa buffer de dados
ser.setDTR(True) # Liga DTR novamente
# Variáveis de controle
frequencia = int(ser.readline().replace('\r\n',''))
# Arquivos de log
fisiologfile = open(argumento[2],'w')
now=datetime.datetime.now()
fisiologfile.write(now.strftime("#Frequência (Em Heartz)\t"+str(frequencia)+"\n"+"#Estação Biométrica\n"+"#Coleta de dados iniciado em: "+"%Y-%m-%d %H:%M:%S" +"\n"+"#Protocolo usado: a primeira coluna é a medida do primeiro termistor e a segunda do segundo.\n"))
fisiologfile.close()
print "Data e hora da medida \t\tMedida 1\tMedida 2"
time = int(argumento[3])*frequencia
time_counter = 0;
while (time_counter <= time or time == 0):
time_counter += 1
print time, time_counter
try:
option = ser.read()
# Respiração
# Para o python '\x' serve para representar uma caracter HEX ASCII
# e o 0x para para valores HEX literais. O comando write do arduino
# envia um caracter, logo deve-se usar a primeira forma
if option == "\x0A":
sensor_value1 = ser.readline().replace('\r\n','')
sensor_value2 = ser.readline().replace('\r\n','')
# Arquivo de log
fisiologfile = open(argumento[2],'a')
fisiologfile.write(str(sensor_value1)+"\t"+str(sensor_value2)+"\n")
fisiologfile.close()
# Registra horário atual
now = datetime.datetime.now()
# Mostrando dados na tela
print now.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3],"\t", sensor_value1, "\t\t", sensor_value2
# Erro 1
if option == '\x01':
print 'Frequência muito alta para o microcontrolador: ', frequencia, '. Finalizando processo.\n'
except KeyboardInterrupt:
break
ser.close()
#Frequência (Em Heartz) 15
#Estação Biométrica
#Coleta de dados iniciado em: 2015-03-13 16:27:04
#Protocolo usado: a primeira coluna é a medida do primeiro termistor e a segunda do segundo.
429 447
439 452
438 430
429 427
431 416
429 445
453 431
446 432
445 443
438 442
447 448
433 446
434 428
444 448
445 433
440 442
444 444
458 427
446 460
447 460
446 471
446 456
442 466
447 440
445 441
443 440
442 455
447 455
445 446
448 430
450 468
442 455
450 455
453 459
445 453
452 455
454 464
449 446
449 464
439 457
445 455
442 472
450 445
452 452
448 462
448 445
454 449
448 464
458 449
453 453
447 464
451 471
455 454
455 459
447 455
457 473
453 484
454 435
450 460
447 451
450 457
449 476
449 485
455 449
447 453
440 449
441 452
449 448
448 482
441 442
439 440
445 428
445 444
444 442
445 442
442 422
434 456
445 432
440 441
437 453
440 443
438 454
441 425
438 408
437 440
438 440
438 425
437 431
439 448
436 430
432 435
436 434
439 429
430 404
438 440
435 430
429 426
432 428
422 423
437 418
435 410
437 427
427 421
429 422
435 413
428 434
428 424
432 417
434 464
426 427
426 427
435 417
429 421
432 419
427 417
421 427
425 416
429 418
426 422
418 419
420 419
415 430
412 418
427 418
425 457
426 416
420 427
430 444
435 447
435 442
436 451
431 441
443 441
442 428
436 457
434 457
433 434
440 453
446 444
437 458
438 471
434 452
437 450
443 446
451 445
440 454
440 469
444 446
440 465
435 463
445 438
445 480
442 462
445 465
439 414
441 466
440 482
443 456
444 469
446 472
431 461
446 471
448 450
447 464
451 439
450 450
451 464
442 483
445 483
444 456
444 439
449 468
443 470
451 458
446 452
447 461
449 469
449 469
450 467
456 469
443 467
455 483
442 475
445 482
445 491
448 456
444 478
435 450
446 445
443 461
444 459
434 444
444 448
444 465
444 459
452 440
449 449
439 447
451 437
431 450
438 449
438 457
444 464
440 440
429 441
430 445
434 429
434 430
431 440
433 439
432 432
439 443
439 446
441 442
443 446
432 434
423 436
432 433
438 432
432 428
446 432
424 432
434 431
432 424
433 412
439 433
434 457
429 435
428 444
436 414
428 447
421 438
427 426
426 414
425 422
418 434
428 432
424 426
427 416
421 431
423 456
427 429
423 432
429 415
436 449
427 454
432 413
434 432
429 436
439 464
433 424
434 448
434 445
437 465
430 432
443 459
434 453
436 458
438 480
444 485
439 463
436 471
443 466
442 448
441 458
440 447
444 459
441 461
446 451
447 450
445 479
444 456
445 456
451 457
446 467
438 464
443 462
441 483
446 467
449 481
438 469
442 461
444 454
439 477
442 482
439 475
442 465
447 464
445 460
447 474
445 471
439 457
450 446
443 494
442 512
439 483
442 477
438 475
446 478
432 464
445 463
454 480
445 458
446 469
450 470
444 471
457 497
443 461
431 470
440 459
436 462
436 456
438 449
440 447
436 445
446 459
437 442
444 459
436 446
440 439
437 431
445 432
438 452
440 419
436 423
439 433
442 426
445 435
438 439
437 419
440 432
432 449
432 420
440 456
436 440
442 433
438 437
435 424
431 434
433 443
436 417
435 427
425 427
436 429
430 426
432 426
427 419
429 431
432 424
429 434
438 408
426 430
435 425
439 412
425 433
425 428
426 418
428 421
432 423
428 418
432 427
429 424
428 424
430 434
432 443
423 418
440 425
426 434
433 451
432 456
437 443
402 438
436 440
430 450
439 446
439 451
431 448
439 447
443 441
441 462
432 447
440 422
445 452
444 451
443 442
447 457
447 447
439 451
443 440
443 461
437 446
446 445
435 447
449 428
446 454
445 452
444 454
448 475
441 454
450 473
444 468
450 463
442 464
448 448
447 463
443 467
440 474
450 464
457 464
439 467
446 477
454 463
458 452
452 462
447 460
441 471
454 474
450 449
452 462
453 478
449 435
453 468
453 464
458 479
445 485
448 482
448 459
451 470
448 473
455 442
452 442
444 464
451 469
448 465
443 424
446 455
450 451
450 447
438 463
435 440
445 448
441 445
442 477
444 444
440 444
443 443
437 428
444 438
441 440
435 446
440 446
432 435
432 434
444 422
444 440
436 431
443 422
443 427
434 429
435 422
431 421
437 419
435 418
437 425
429 420
442 402
427 417
432 420
433 424
424 416
442 416
430 403
432 438
432 426
432 428
429 430
425 417
435 420
425 413
426 417
421 397
430 417
429 452
422 413
425 430
421 427
431 457
430 435
429 428
434 449
440 433
438 449
438 444
435 437
443 430
440 442
440 439
437 451
440 456
439 420
435 443
437 447
434 453
444 448
444 479
471 453
448 459
438 443
444 453
443 456
430 453
450 463
448 454
446 451
452 449
456 465
451 448
443 454
451 463
455 472
448 470
450 449
454 466
451 458
454 459
450 447
454 471
457 469
450 474
455 455
456 459
444 468
454 469
453 455
458 474
449 437
449 469
445 460
457 484
458 479
447 465
459 472
456 459
446 475
459 463
457 465
457 462
455 457
456 468
449 445
458 443
453 438
450 434
450 448
440 465
451 449
443 465
447 440
454 433
446 442
453 451
455 450
442 457
438 434
452 441
447 428
446 440
443 451
448 444
446 416
447 472
439 423
448 428
446 428
445 419
444 442
434 449
442 455
443 434
441 431
445 443
446 428
444 421
439 420
443 447
437 412
436 428
442 433
439 440
442 422
439 411
444 429
436 410
435 439
445 433
440 430
440 438
441 428
446 428
435 435
438 422
438 405
438 423
438 441
441 453
442 413
423 423
424 406
435 435
435 428
445 431
446 441
440 429
442 442
445 440
450 432
445 431
455 440
439 443