温度ロガーできた。

  • このエントリーをはてなブックマークに追加
  • Pocket


毎度外見という面では特にかわらないんですけども。デジタル電子工作なので。
温度ロガーを作りました。
LM60という温度計ICの出力をATmega328PのADCに入れて、ATmegaからUSARTでパソコンに送るという代物です。
sprintfを使ったら、サイズが大きくなったのであきらめました。floatをつかってもサイズが大きくなりましたが妥協しました。

ADCの基準電圧は内部の1.1Vを一応使っていますが、これはギャップ電圧から求めているそうなので、温度によって変化します。そのため、温度計のADCの基準電圧としてはよくないです。実際の運用にはリチウムイオン電池とかを使うといいのかも。

家の今の気温は~27℃のようです。指でLM60を触ると、30℃くらいまで上がります。


#include <avr/io.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define USART_BAUD 300


void ADC_Init(void){
  //ADC Multiplexer Selection Register
  ADMUX = (3<<REFS0)|(0<<MUX0);

  //ADC Control and Status Register A
  ADCSRA = (1<<ADEN)|(1<<ADSC)|(0b111<<ADPS0);

  //Digital Input Disable
  DIDR0 = 0b00111111;
}


void USART_Init( unsigned int ubrr )
{
  /* Set baud rate */
  UBRR0H = (unsigned char)(ubrr>>8);
  UBRR0L = (unsigned char)ubrr;
  /* Enable receiver and transmitter */
  UCSR0B = (1<<RXEN0)|(1<<TXEN0);
  /* Set frame format: 8data, 1stop bit */
  UCSR0C = (0<<USBS0)|(3<<UCSZ00);
}


void USART_Transmit( unsigned char data )
{
  /* Wait for empty transmit buffer */
  while ( !( UCSR0A & (1<<UDRE0)) )
    ;
  /* Put data into buffer, sends the data */
  UDR0 = data;
}


unsigned char USART_Receive( void )
{
  /* Wait for data to be received */
  while ( !(UCSR0A & (1<<RXC0)) )
  ;
  /* Get and return received data from buffer */
  return UDR0;
}

uint16_t ADC_Read(void){
  uint16_t d;

  ADCSRA |= (1<<ADSC);

  loop_until_bit_is_clear(ADCSRA, ADSC);

  d = ADCL;
  d |= (ADCH << 8);

  return d;
}



int main(void){
  uint16_t adcd = 0;
  unsigned char i = 0;
  unsigned char str[30];
  float a = 0.0;

  USART_Init((F_CPU/(16 * USART_BAUD))-1);
  ADC_Init();

  while(1){

    USART_Receive();
    adcd = ADC_Read();

    //itoa(adcd, str, 10);
    //sprintf(str, "%4d : %.3d\r\n", adcd, 1);
    a = (adcd * 1.1/1024 - 0.424)/0.00625 * 1000;
    itoa((int)a, str, 10);

    i = 0;
    while('\0' != *(str+i)){

      USART_Transmit(*(str+i));
      i++;
    }
    USART_Transmit('\r');
    USART_Transmit('\n');

  }

  return 0;
}

  • このエントリーをはてなブックマークに追加
  • Pocket

コメントを残す