--- /dev/null
+/*
+ * get voltage (drop) -> resistance => estimate temperature
+ *
+ * author: hackbard@hackdaworld.org
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <termios.h>
+#include <sys/ioctl.h>
+#include <errno.h>
+#include <math.h>
+
+/*
+ * user defineable values of used components, you want to edit this!
+ */
+
+#define COUNTER (256*256)
+#define PRESCALE 64
+#define FREQ 8000000
+#define CAP 0.0001
+#define RES_NEXT_CAP 10000
+#define U0 5.0
+#define RES_NTC 3550
+#define NTC_R_TO_T(x) (-3e-5*(x)*(x)+0.2388*(x)-110.09)
+
+#define MAGIC_U 0.2
+
+int main(int argc,char **argv) {
+
+ int fd,ret;
+ unsigned short c;
+ unsigned int sum,count;
+ unsigned char hl[2];
+ double max,u_ntc,r_ntc;
+ struct termios term;
+
+ if(argc!=2) {
+ printf("usage: %s <serial device>\n",argv[0]);
+ return -1;
+ }
+
+ max=U0*(1.0-exp(-1.0*COUNTER*PRESCALE/FREQ/(RES_NEXT_CAP*CAP)));
+
+ memset(&term,0,sizeof(struct termios));
+
+ fd=open(argv[1],O_RDONLY);
+ if(fd<0) {
+ perror("open call");
+ return -1;
+ }
+
+ tcgetattr(fd,&term);
+
+ cfsetispeed(&term,B9600);
+ cfsetospeed(&term,B9600);
+
+ term.c_cflag&=~PARENB;
+ term.c_cflag&=~CSTOPB;
+ term.c_cflag&=~CSIZE;
+ term.c_cflag|=CS8;
+
+ term.c_lflag&=~(ICANON|ECHO|ECHOE|ISIG);
+
+ term.c_iflag&=~(IXON|IXOFF|IXANY);
+
+ tcsetattr(fd,TCSANOW,&term);
+
+ count=0;
+ sum=0;
+
+ printf("\n");
+ printf("low cost adc using analog comparator!\n");
+ printf("-------------------------------------\n");
+ printf("\n");
+ printf("this piece of code:\n");
+ printf(" - is estimating the voltage drop V at the ntc\n");
+ printf(" - calculates the resistance R of the ntc\n");
+ printf(" - tells us the corresponding temperature T\n");
+ printf("\n");
+ printf("here we go ....\n");
+ printf("\n");
+
+ while(1) {
+
+ ret=read(fd,hl,2);
+ if(ret!=2) {
+ perror("read 2");
+ return -1;
+ }
+
+ c=(hl[0]<<8)|hl[1];
+ count+=1;
+ sum+=c;
+
+ u_ntc=MAGIC_U+c*max/COUNTER;
+ r_ntc=u_ntc/(U0-u_ntc)*RES_NTC;
+
+ printf("\rV: %f | %f [%f] # R: %f # T: %f",
+ c*max/COUNTER,sum*max/(count*COUNTER),u_ntc,
+ r_ntc,NTC_R_TO_T(r_ntc));
+ fflush(stdout);
+
+ if(count==5) {
+ sum/=count;
+ count=1;
+ }
+ }
+
+ close(fd);
+
+ return 0;
+}
+