Данный проект позволит вам собрать простой термометр на основе всего лишь нескольких компонентов, таких как плата Arduino, модуль датчика MCP9808, 4-разрядный 7-сегментный индикатор и резисторы 1 кОм. Используя данное устройство, вы сможете измерять температуру с достаточно высокой точностью.

MCP9808 представляет собой цифровой датчик температуры с интерфейсом I2C, который является одним из самых точных датчиков в бюджетном сегменте. Он обладает типичной погрешностью ±0,25°C в диапазоне от -40°C до +125°C и точностью +0,0625°C. MCP9808 отлично работает с любым микроконтроллером, использующим стандарт интерфейса I2C. У него имеются 3 адресных контакта, поэтому вы можете подключить до 8 устройств к одной шине I2C без конфликтов адресов. А благодаря широкому диапазону напряжений питания можно использовать его с логикой от 2,7 В до 5,5 В.


На следующих рисунках представлены наглядная схема подключения компонентов на макетной плате и принципиальная схема.


Код программы Arduino довольно прост и линеен по своей сути. Он представлен далее. Закомментированные строки в нем предполагают отображение температуры в фаренгейтах. По умолчание она отображается в цельсиях.
#include <Wire.h>
#include "Adafruit_MCP9808.h"
Adafruit_MCP9808 tempSensor = Adafruit_MCP9808();
int pinA = 11;
int pinB = 7;
int pinC = 4;
int pinD = 2;
int pinE = 1;
int pinF = 10;
int pinG = 5;
int pinDP = 3;
int D1 = 12;
int D2 = 9;
int D3 = 8;
int D4 = 6;
void setup() {
pinMode(pinA, OUTPUT); //11
pinMode(pinB, OUTPUT); //7
pinMode(pinC, OUTPUT); //4
pinMode(pinD, OUTPUT); //2
pinMode(pinE, OUTPUT); //1
pinMode(pinF, OUTPUT); //10
pinMode(pinG, OUTPUT); //5
pinMode(D1, OUTPUT); //12
pinMode(D2, OUTPUT); //9
pinMode(D3, OUTPUT); //8
pinMode(D4, OUTPUT); //6
tempSensor.begin(0x18);
}
void loop() {
float C = tempSensor.readTempC();
// float F = C*9.0/5.0 + 32;
int tempd1 = int(C / 10);
int tempd2 = int((int)C % 10);
// int tempd1 = int(F/10);
// int tempd2 = int((int)F%10);
for (int i = 0; i < 2000; i++) {
digitalWrite(D1, LOW);
digitalWrite(D2, HIGH);
digitalWrite(D3, HIGH);
digitalWrite(D4, HIGH);
disp(tempd1);
delay(1);
digitalWrite(D1, HIGH);
digitalWrite(D2, LOW);
digitalWrite(D3, HIGH);
digitalWrite(D4, HIGH);
disp(tempd2);
delay(1);
digitalWrite(D1, HIGH);
digitalWrite(D2, HIGH);
digitalWrite(D3, LOW);
digitalWrite(D4, HIGH);
disp(11);
delay(1);
digitalWrite(D1, HIGH);
digitalWrite(D2, HIGH);
digitalWrite(D3, HIGH);
digitalWrite(D4, LOW);
disp(10);
delay(1);
// digitalWrite(D1, HIGH);
// digitalWrite(D2, HIGH);
// digitalWrite(D3, HIGH);
// digitalWrite(D4, LOW);
// disp(12);
// delay(1);
}
displayoff();
tempSensor.shutdown_wake(1);
delay(2000);
tempSensor.shutdown_wake(0);
}
void disp(int number) {
switch (number) {
case 0 :
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, LOW);
break;
case 1 :
digitalWrite(pinA, LOW);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
break;
case 2 :
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, LOW);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, LOW);
digitalWrite(pinG, HIGH);
break;
case 3 :
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, HIGH);
break;
case 4 :
digitalWrite(pinA, LOW);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
break;
case 5 :
digitalWrite(pinA, HIGH);
digitalWrite(pinB, LOW);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, LOW);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
break;
case 6 :
digitalWrite(pinA, HIGH);
digitalWrite(pinB, LOW);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
break;
case 7 :
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
break;
case 8 :
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
break;
case 9 :
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
break;
case 10 :
digitalWrite(pinA, HIGH);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, LOW);
break;
case 11 :
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
break;
// digitalWrite(pinA, HIGH);
// digitalWrite(pinB, LOW);
// digitalWrite(pinC, LOW);
// digitalWrite(pinD, LOW);
// digitalWrite(pinE, HIGH);
// digitalWrite(pinF, HIGH);
// digitalWrite(pinG, HIGH);
// break;
}
}
void displayoff() {
digitalWrite(D1, HIGH);
digitalWrite(D2, HIGH);
digitalWrite(D3, HIGH);
digitalWrite(D4, HIGH);
}
© digitrode.ru