ciao a tutti.
ho un problema che è da due giorni che cerco di risolvere ma non he cavato fuori nulla:
ho tre pt100 da cui voglio leggere i loro valori di resistenza. ho comprato questo integrato http://www.smartec.nl/pdf/DSUTI.pdf che sembra proprio fare al caso mio: è progettato appositamente per la lettura di pt100 più altro ancora.
come circuitino e codice ho presto spunto da questo topic http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1269857588 utilizzando il codice di quell'utente (quello verso il fondo della pagina).
riporto anche qui il codice:
#include <stdio.h>
#include "pins_arduino.h"
#define UTI_PIN 5
#define UTI_RESISTANCE_REF 1000
void setup()
{
Serial.begin(9600);
pinMode(UTI_PIN, INPUT);
}
void loop()
{
double res1,res2,res3;
if(ReadUTI(UTI_PIN,&res1,&res2,&res3,UTI_RESISTANCE_REF)) {
Serial.print("Resistance 1: ");
Serial.print(res1);
Serial.print("\t");
Serial.print("Resistance 2: ");
Serial.print(res2);
Serial.print("\t");
Serial.print("Resistance 3: ");
Serial.print(res3);
Serial.print("\t");
}
else {
Serial.print("Not Found");
}
Serial.print("\n");
delay(2000);
}
int ReadUTI(uint8_t pin, double * res1,double * res2,double * res3,int refRes)
{
int state = HIGH;
int i,startindex=-1;
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
uint8_t stateMask = (state ? bit : 0);
unsigned long width[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
double nOff=0,nAB=0,nCD=0,nBC=0,nDF=0;
while ( (*portInputRegister(port) & bit) != stateMask)
;
for(i=0;i<12;i++) {
while ( (*portInputRegister(port) & bit) == stateMask)
width[i]++;
while ( (*portInputRegister(port) & bit) != stateMask)
width[i]++;
}
for(i=1;i<12;i++) {
if(i<7) {
if(width[i]<width[i+2]&&width[i]<width[i+3]&&width[i]<width[i+4]&&width[i]<width[i+5]&&width[i+1]<width[i+2]&&width[i+1]<width[i+3]&&width[i+1]<width[i+4]&&width[i+1]<width[i+5]) {
startindex=i;
i=12;
}
}
}
if(startindex!=-1) {
nOff=width[startindex]+width[startindex+1];
nAB=width[startindex+2];
nCD=width[startindex+3];
nBC=width[startindex+4];
nDF=width[startindex+5];
*res1=((nBC-nOff)/(nAB-nOff))*refRes;
*res2=((nCD-nOff)/(nAB-nOff))*refRes;
*res3=((nDF-nOff)/(nAB-nOff))*refRes;
return 1;
}
else {
return 0;
}
}
premetto che fino a un mese fa ha sempre funzionato egregiamente. ieri ritiro fuori il tutto, collego le pt100 al circuito, attacco arduino e non mi legge più niente.
facenco un po di debug software, ho notato che mi si blocca all'interno di questo ciclo while (sulla seriale mi viene stampato solamente '2' ma non '3').
Serial.println("2");
for(i=0;i<12;i++) {
while ( (*portInputRegister(port) & bit) == stateMask)
width[i]++;
Serial.println("3");
io avevo preso questo codice già fatto che funzionava egregiamente: in realtà non conosco bene il significato delle istruzioni all'interno della funzione int ReadUTI (moltre istruzioni sono prese dalla libreria pins_arduino.h), quindi non capisco bene perchè si blocca. ripeto: ha sempre funzionato bene, quantomento mi ha sempre stampato a video il valore delle resistenze (anche se sballate). non riesco a capire se sono partite le pt100 (ma non credo), se è partito l'integrato (possibile?) o arduino(dubito, perchè con altri programmi che ho funziona bene).
qualcuno mi può dare una mano?
EDIT: ho fatto una prova con un multimetro a misurare le resistenze delle pt100 (con tutto il circuito collegato allo smartec uti e alimentato): tutte e le tre sonde mi danno un valore di circa 106.5ohm, che corrisponde a circa 16.7 gradi celsius (compatibile con la temperatura attuale in camera mia).
quindi sembra che l'integrato funzioni. a questo punto c'è qualcosa di sbagliato nel codice: ora che ci penso un mesetto fa avevo ancora una versione vecchia dell'ide di arduino: ho provato a installare quelle vecchie ma ho sempre lo stesso problema. devo trovare un codice alternativo da far girare, ma non ho idea di come modificarlo.