Модуль CJMCU LM75 представляет собой цифровой датчик температуры на ИМС LM75A. Датчик температуры использует шину I2C, что дает возможность подключения одновременно до 8 температурных датчиков.
- Диапазон температур: -55°C … +125°C (±2°C)
- Разрешение: 11 бит
- Напряжение питания: 2.8 В … 5.5 В
Для установки адреса на шине отвечают выходы, A0, A1 и A2, перед подключением необходимо установить перемычки к VDD или GND.
Более подробно о датчике температуры можно узнать в http://rcl-radio.ru/?p=83500
Схема модуля
На ATtiny2313 с применением LM75A можно создать простой электронный термометр, информация о температуре будет выводится на модуль индикатора TM1637 который представляет собой 4-х разрядный семисегментный дисплей на базе драйвера TM1637.
Схема электронного термометра
Информация о температуре которую LM75A передает в микроконтроллер содержит 11 бит, старшие 8 бит содержат целое число градусов Цельсия, а оставшиеся 3 младшие биты десятые доли градуса, что кратно 0,125 °С, но в данном проекте десятые доли выводятся кратно 0,5 °С.
Перед загрузкой скетча рекомендую ознакомится со статьей — ATtiny2313 + Arduino IDE
Адрес LM75A в данном примере 0b10010000
#define SDA 2 // PB2 #define SCL 3 // PB3 void setup(){ i2c_start(); i2c_write_byte(0b10010000); i2c_write_byte(0x01); i2c_write_byte(0b00000000); i2c_stop(); delay(1000); } bool i2c_read_bit() { bool i2c_bit = 1; DDRB &= ~(1 << SDA); delayMicroseconds(10); DDRB &= ~(1 << SCL); if((PINB >> SDA) & 1) i2c_bit=0; delayMicroseconds(10); DDRB |= (1 << SCL); return i2c_bit; } byte i2c_write_byte(byte data){ for (byte i=0; i<8; i++){i2c_write_bit((data&0x80)==0);data<<=1;} return i2c_read_bit(); } byte i2c_read_byte(byte a){ byte i, data=0; for(i=0; i<8; i++){if (!i2c_read_bit()) data++;if(i!=7) data<<=1;} i2c_write_bit(a);return data; } void i2c_write_bit(byte b){ delayMicroseconds(5); if(b){DDRB |= (1 << SDA);}else{DDRB &= ~(1 << SDA);} delayMicroseconds(5); DDRB &= ~(1 << SCL); delayMicroseconds(10); DDRB |= (1 << SCL); } void i2c_start(){ delayMicroseconds(10); DDRB &= ~(1 << SDA); DDRB &= ~(1 << SCL); delayMicroseconds(10); DDRB |= (1 << SDA); PORTB &= ~(1 << SDA); delayMicroseconds(10); DDRB |= (1 << SCL); PORTB &= ~(1 << SCL); delayMicroseconds(10); } void i2c_stop() { DDRB |= (1 << SDA); delayMicroseconds(10); DDRB &= ~(1 << SCL); delayMicroseconds(10); DDRB &= ~(1 << SDA); } float lm75(){ i2c_start(); i2c_write_byte(0b10010000); i2c_write_byte(0x00); i2c_start(); i2c_write_byte(0b10010001); int value1 = i2c_read_byte(1)*10; int value0 = i2c_read_byte(0) >> 5; if(value0 < 4){value0 = 0;}else{value0 = 5;} i2c_stop(); return value1 + value0; } void loop() { if(lm75()<0){print_time(abs(lm75()),1,7,1);} else{print_time(lm75(),1,7,0);} delay(1000); } void tm_dec(byte dig){ for(int i = 0; i < 8; i++) { DDRB |= (1 << 0);del(); if (dig & 0x01) DDRB &= ~(1 << 1); else DDRB |= (1 << 1);del(); DDRB &= ~(1 << 0);del(); dig = dig >> 1; } DDRB |= (1 << 0); DDRB &= ~(1 << 1);del(); DDRB &= ~(1 << 0);del(); if (((PINB >> 1) & 1) == 0) DDRB |= (1 << 1);del(); DDRB |= (1 << 0);del(); } void tm_stop(){ DDRB |= (1 << 1);del(); DDRB &= ~(1 << 0);del(); DDRB &= ~(1 << 1);del(); } void tm_start(){ DDRB |= (1 << 1);del(); } void print_time(int t, byte pd_t, int br, byte mn){ tm_start();tm_dec(0b10001000 + br);//tm_stop();tm_start(); tm_dec(0x40);tm_stop();tm_start(); int data0; if(mn==1){data0 = 11;} else{data0 = 10;} int data1 = t / 100 % 10; int data2 = t / 10 % 10; int data3 = t % 10; for(byte n = 0; n < 4; n++){ int data; switch(n){ case 0: data = data0;break; case 1: data = data1;break; case 2: data = data2;break; case 3: data = data3;break; } switch(data){ // XGFEDCBA case 0: data = 0b00111111;break; // 0 case 1: data = 0b00000110;break; // 1 case 2: data = 0b01011011;break; // 2 case 3: data = 0b01001111;break; // 3 case 4: data = 0b01100110;break; // 4 case 5: data = 0b01101101;break; // 5 case 6: data = 0b01111101;break; // 6 case 7: data = 0b00000111;break; // 7 case 8: data = 0b01111111;break; // 8 case 9: data = 0b01101111;break; // 9 case 10: data = 0b00000000;break; // пусто case 11: data = 0b01000000;break; // - } if(n == 0){data0 = data;} if(n == 1){data1 = data;} if(n == 2){data2 = data;} if(n == 3){data3 = data;} } switch(pd_t){ case 1 : data2 = data2+0b10000000;break; case 2 : data1 = data1+0b10000000;break; case 3 : data0 = data0+0b10000000;break; } tm_dec(0xC0);tm_dec(data0);tm_dec(data1);tm_dec(data2);tm_dec(data3);tm_stop(); } void del(){delayMicroseconds(200);}
Скетч использует 1734 байт (84%) памяти устройства. Всего доступно 2048 байт.
Глобальные переменные используют 9 байт (7%) динамической памяти, оставляя 119 байт для локальных переменных. Максимум: 128 байт.Arduino IDE 1.8.9 | Плата для прошивки версии 1.2.5 (выбрать в менеджере плат)