Temp logger - RS232

Berätta om dina pågående projekt.
Anonym2
Inlägg: 456
Blev medlem: 17 november 2007, 21:20:16

Temp logger - RS232

Inlägg av Anonym2 »

Hej

Nu har jag färdiställt ett litet projekt med en Temperaturlogger. Den betår av dessa delar

Atmega8
Max232
LM335z - tempgivare
7805 -spännings regulator.

Den fungerar på så sätt att den mäter temperaturen via sonden(krympslangad lm335z), atmegan skickar via Max232(som omvandlar till rätt spänningsnivåer) till datorn. I datorn har jag installerat ett program som heter Bill Redirect http://www.billproduction.com/ som emulerar ett tangentbord och ger dom knapptryckningar som kommer in på comporten(9600baud). Efter detta har jag bara öppnat ett excel fönster, och sen plottas det automatiskt upp en snygg kurva.

Bild

Kod: Markera allt


#include <avr/io.h> 

#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((4000000 / (USART_BAUDRATE * 16UL))) - 1) 

void SendChar(char);
void SendString(char*);

int main (void) 
{ 
  
int temp;
int btemp;
char dtemp[5];
int sec;

   TCCR1B |=((1 << CS10)|(1 << CS11));
   

   ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Set ADC prescalar to 128 - 125KHz sample rate @ 16MHz 

   ADMUX |= (1 << REFS0 | 1 << REFS1) ; // Set ADC reference to 2,56v(internal) 
   

   

   ADCSRA |= (1 << ADFR);  // Set ADC to Free-Running Mode 
   ADCSRA |= (1 << ADEN);  // Enable ADC 
   ADCSRA |= (1 << ADSC);  // Start A2D Conversions 


   
   char ReceivedByte; 

   UCSRB |= (1 << RXEN) | (1 << TXEN);   // Turn on the transmission and reception circuitry 
   UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1); // Use 8-bit character sizes 

   UBRRL = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register 
   UBRRH = (BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register 

   for (;;) // Loop forever 
   { 
while(sec <= 20)
	{
	while(TCNT1 <= 31250)
		{
		}
	TCNT1 = 0;
	sec++;
	}
	btemp = ADCL + (ADCH<<8);
	temp = (btemp-529)/2;
	itoa(temp, dtemp,10);
	SendString(dtemp);
	SendString("{ENTER}");
	TCNT1 = 0;
    sec = 0;
   
    
 	
	}   
} 


void SendChar(char data) 
	{ 
    while ((UCSRA & (1 << UDRE)) == 0) {}; // Do nothing until UDR is ready for more data to be written to it 
      UDR = data; // Send data to the computer 
	} 

void SendString(char* StringPtr) 
	{ 
   while (*StringPtr) 
    	{
		SendChar(*StringPtr); 
   		StringPtr++; 
		}
	} 




i sin nuvarande form så skickar programmet temperaturen var 10.e sekund.


Bild

Här har jag testat den på en batteriladdare.
//Alexander
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Re: Temp logger - RS232

Inlägg av squiz3r »

Ser fint ut! Jag ska spara länken till det programmet. Det verkar användbart!
Användarvisningsbild
MicaelKarlsson
Inlägg: 4669
Blev medlem: 18 juni 2004, 09:16:07
Ort: Aneby
Kontakt:

Re: Temp logger - RS232

Inlägg av MicaelKarlsson »

Trevligt och tack för länken, kan bli användbart!!

Edit: Hmmm.... 35$ USD
Anonym2
Inlägg: 456
Blev medlem: 17 november 2007, 21:20:16

Re: Temp logger - RS232

Inlägg av Anonym2 »

Jag kom på lösningen med tangentbords emulering när jag letade efter en smidig lösning att kunna styra min linux dator, där mycket kan göras från konsollen. Hittade dock inte något sådant program för linux. Men det funkar bra till Windows


Jag tänkte bygga till en funktion där man inte behöver ha datorn ansluten när man loggar, typ en switch man slår över från inspelning till uppspelning.

Edit: Testversionen fungerar i 30minuter, sen måste man starta om programmet. I inloggningsrutan som kommer upp när man startar programet ska man skriva "www.billproduction.com" för att köra i "freeware" läge.

//Alexander
Användarvisningsbild
maha
EF Sponsor
Inlägg: 1685
Blev medlem: 22 november 2005, 09:47:02
Ort: Jakobstad, Finland

Re: Temp logger - RS232

Inlägg av maha »

Ett lite snyggare sätt att lösa det på är att kavla upp ärmarna och lära sig lite VBA:

http://dev.emcelettronica.com/serial-po ... -excel-vba
bos
Inlägg: 2311
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: Temp logger - RS232

Inlägg av bos »

> Ett lite snyggare sätt att lösa det på är att kavla upp ärmarna och lära sig lite VBA

Eller gnuplot: http://www.gnuplot.info/
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Temp logger - RS232

Inlägg av v-g »

Hårdast är att koda det i assembler :mrgreen:

Smart projekt annars!

Vore fiffigt att kunna logga med enbart µcn och sen överföra till datorn, kanske kan bli version 2.0 det ;)
Anonym2
Inlägg: 456
Blev medlem: 17 november 2007, 21:20:16

Re: Temp logger - RS232

Inlägg av Anonym2 »

"Temp logger - RS232 mkII" är redan under utveckling :)

Med hjälp av ett externt i2c eeprom på 64kb så ska den kunna logga 5st olika temperaturer under en dryg vecka, med en sampling per minut och givare. Ska börja bygga på den så snart delarna kommer.

//Alexander
Anonym2
Inlägg: 456
Blev medlem: 17 november 2007, 21:20:16

Re: Temp logger - RS232

Inlägg av Anonym2 »

Nu börjar MkII ta form!
Bild

EEPROMET på 64kb är inte i drift än. Den loggar 400värden(ungefär vad som får plats) under en dryg timme(var 10.e sekund). Genom att trycka på brytaren på kortet så börjar kretsen skicka över informationen via RS232 linken. När detta är klart så tömmer den all data ur minnet och börjar om igen. Nu har den dessutom 2st tempsonder.

För att få in värdena i en snygg graf har jag sparat en "logg" i terminalprogrammet som jag sen har importerat till "excel". Nästa moment blir att få igång EEPROMET. Så fort det är gjort så ökar loggningstiden markant. Runt 18timmar med loggning 1ggr/s eller 44dygn med 1 sampling per minut.

//Alexander
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Re: Temp logger - RS232

Inlägg av squiz3r »

Detta är i princip exakt samma som ett projekt jag började med för ett årsedan eller något sån, dock kom jag aldrig så långt att jag lyckades koppla in mitt 64kB EEPROM. Jag gjorde ett eget program till datorn i C++ som ritade ut grafen (kunde även spara det som en .xl (eller vad är det nu xcellfilerna heter?). Men jag gillar din version! :D
Användarvisningsbild
MiaM
Inlägg: 12832
Blev medlem: 6 maj 2009, 22:19:19

Re: Temp logger - RS232

Inlägg av MiaM »

Ranstam skrev:Jag kom på lösningen med tangentbords emulering när jag letade efter en smidig lösning att kunna styra min linux dator, där mycket kan göras från konsollen. Hittade dock inte något sådant program för linux. Men det funkar bra till Windows
Jag pillade med det där för länge sedan. Jag minns inte exakt hur jag gjorde men minns att jag kollade på källkoden till ps2-tangentbordsdrivern i linuxkärnan och använde samma funktioner (api/syscall/<vad det nu kallas>) för att emulera tangenttryckningar direkt in i kärnan. Jag minns inte om jag provade ifall ctrl+alt+delete funkade, men allt annat som att växla virtuella (textmode)-konsoller å sånt funkade. Musrörelser skickade jag däremot in direkt i X11 (minns inte hur det gick till, minns dock däremot att jag debuggade med xev-programmet som ingår i X11).

Fast allt det här är ju mycket sämre än att skriva kod som pratar med serieporten direkt, i det här fallet i alla fall.
Ranstam skrev:EEPROMET på 64kb är inte i drift än. Den loggar 400värden(ungefär vad som får plats) under en dryg timme(var 10.e sekund). Genom att trycka på brytaren på kortet så börjar kretsen skicka över informationen via RS232 linken. När detta är klart så tömmer den all data ur minnet och börjar om igen. Nu har den dessutom 2st tempsonder.
Ett tips är väl att istället göra så att datorn skickar något på serieporten och det får kortet att skicka ut data till datorn. Det kan väl också vara bra att låta datorn skicka ett 'radera'-kommando till kortet för att kortet verkligen ska 'börja om', så slipper man risken att man tappar data om programmet i datorn kraschar medan det läser ur data ur kortet.

Snyggast är kanske att kortet lagrar allt i en ringbuffer och bara fortsätter att skriva, d.v.s. utan nåt "börja om från början"-kommando. Datorn får då fråga var i ringbufferten senaste skrivningen skedde, och sen begära att läsa ur en lagom del av ringbufferten (eller kanske hela beroende på vad för hastighet du har på serieporten).

Om du vill ha en massa datanördprogrammeringssysselsättning så kan du lära dig SQL (med t.ex. mysql) och skriva ner mätvärdena i en databas, då kan man göra en massa fräcka grejer halvautomagiskt såsom att t.ex. kolla vad medeltemperaturen för klockan 0800 varje onsdag de senaste sju veckorna varit eller liknande statistiknörderi. Överkurs :)
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Re: Temp logger - RS232

Inlägg av squiz3r »

...Och om man lägger allt i MySQL så är det ju lätt att komma åt från internet var man än befinner sig 8) (Om man inte vill använda datorn som server borde man väll kunna ha en SQL databas på ett webhotell, och sen kontaktar programmet på ens dator den servern och laddar upp informationen som klient :))

På min version gjorde jag så att på datorprogrammet tryckte man på en knapp, då skickade datorn ut en signal på serieporten och frågade efter loggern, som då, om den var inkopplad, svarade med version nr. m.m. innan datorn bad om vilken data den skulle skicka. Då kunde man även ändra inställningar i loggern från datorn.
Anonym2
Inlägg: 456
Blev medlem: 17 november 2007, 21:20:16

Re: Temp logger - RS232

Inlägg av Anonym2 »

När jag skickar data från loggern till datorn, så kommer allt upp i terminalen i följd. Finns det någon form av "enter" kommando, för att få det i en "stapel" istället?


//Alexander
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Re: Temp logger - RS232

Inlägg av squiz3r »

\n är det väll? Kanske behövs ett \r före också.

Edit: (Carriage return heter den.)
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Temp logger - RS232

Inlägg av v-g »

Eller char nummer 13 men då måste man slå på det i hyperterminalen annars visas det som ett tecken eller hur det nu var.
Skriv svar