/*
Rilevazione meteo con NI-DAQmx
Versione 1.2 (applicazione console)
http://telpar.altervista.org/ni-daqmx/meteo/
Autore: Francesco Parisi
Ultima revisione: 07/Aprile/2007
Hardware: NI 6008-USB -- Software: NI-DAQmx C API 7.5
Oggetto:
Acquisizione di tre segnali lentamente variabili, ad intervalli regolari,
mediante temporizzazione software interna, governata da un ciclo while
CANALE1 (Dev1/ai0): Sensore LM35 (Temperatura interna)
CANALE2 (Dev1/ai1): Sensore AD590 (Temperatura esterna)
CANALE3 (Dev1/ai2): Sensore 2322 (Umidità relativa esterna)
*/
#include <stdio.h>
#include <conio.h>
#include "C:\Programmi\National Instruments\NI-DAQ\DAQmx ANSI C Dev\include\NIDAQmx.h"
#include <windows.h>
#define CAL_INTERNA +0.4 /* Calibrazione sensore temp. interna */
#define CAL_ESTERNA -2.0 /* Calibrazione sensore temp. esterna */
#define CAL_UMIDITA -3.0 /* Calibrazione sensore umidità relativa */
/* Funzione gestione errori */
int DAQmxErrChk (int32);
int main(int argc, char *argv[])
{
int32 taskHandle=0; /* ID del task che verrà assegnato da DAQmxCreateTask */
float64 vet[3]; /* Vettore che contiene i campioni letti */
char input[] = "Dev1/ai0:2"; /* Gli ingressi usati sono AI0, AI1 e AI2 */
float64 minVal=0, maxVal=2.5; /* Gli ingressi sono condizionati al range 0..2.5V */
int32 configInput=DAQmx_Val_RSE; /* Gli ingressi sono configurati come single-ended */
int32 totale=0; /* Totale dei campioni acquisiti */
int delay=500; /* La lettura viene scandita ogni delay msec */
/*********************************************/
/* CREAZIONE DEL TASK */
/*********************************************/
DAQmxErrChk( DAQmxCreateTask("Task_AI",&taskHandle) );
/*********************************************/
/* CONFIGURAZIONE DEL TASK */
/*********************************************/
DAQmxErrChk(
DAQmxCreateAIVoltageChan(
taskHandle,
input,
"",
configInput,
minVal,
maxVal,
DAQmx_Val_Volts,
""
)
);
/*********************************************/
/* AVVIO DEL TASK */
/*********************************************/
DAQmxErrChk( DAQmxStartTask(taskHandle) );
/*********************************************/
/* ESECUZIONE DEL TASK */
/*********************************************/
printf ("\n\n\t\t\tRILIEVO PARAMETRI AMBIENTALI\n\n");
while( !_kbhit() ) { /* finché non premi un tasto, esegui: */
Sleep(delay); /* aspetta delay millisecondi */
DAQmxErrChk(DAQmxReadAnalogF64(
taskHandle, /* Leggi i campioni dal task identificato da taskHandle */
1, /* Quanti campioni per canale? */
10, /* Aspetta al piu` 10sec */
DAQmx_Val_GroupByScanNumber, /* Lettura a priorita' di canale */
vet, /* Indirizzo del vettore */
3, /* Dimensione del vettore vet */
&totale, /* Numero di campioni letti */
NULL /* -- non utilizzato -- */
));
/**** STAMPA RISULTATI ****/
printf("TEMP. INTERNA: %3.1f C TEMP. ESTERNA: %5.1f C UMIDITA` RELATIVA: %3.0f%% \r",
vet[0] * 20 + CAL_INTERNA,
vet[1] * 29.2 + 250 - 273 + CAL_ESTERNA,
vet[2] * 32 + 10 + CAL_UMIDITA);
}
/*********************************************/
/* STOP E CLEARING DEL TASK */
/*********************************************/
if(taskHandle!=0) { /* ... se è stato creato il task */
DAQmxStopTask(taskHandle); /* fermalo */
DAQmxClearTask(taskHandle); /* libera le risorse impegnate per il task */
}
printf("\n\n\nProgramma terminato. Premere un tasto per uscire\n");
getch();
return 0;
}
int DAQmxErrChk (int32 status)
{
char errBuff[2048];
if (status < 0) {
DAQmxGetExtendedErrorInfo(errBuff,2048);
fprintf(stderr, "DAQmx Error: %s\n",errBuff);
return(1);
}
else return 0; /* Nessun errore: ok oppure warning */
}
|