ЗАДАЧА ПРОЕКТА
Задача следующая. Сделать термометр на arduino с минимальной индикацией.
У меня получилось на 5ти светодиодах. И показывает температуру от минус 255 до 255 градусов!!! Без дробной части. Один диод знак числа, и четыре - само число. Для каких целей? Может измерять температуру на улице, может дома, может маслопечки, может тела...Куда угодно можно тыкать датчиком!!!
СХЕМА УСТРОЙСТВА
Не показан знаковый светодиод. Он подключен аналогично и к 13 цифровому выходу.
ВНЕШНИЙ ВИД
МАТ. ЧАСТЬ
1 МИКРОКОНТРОЛЛЕР. Использовал ARDUINO PRO MINI 5v 16 MHz. Программировал программатором. Плюсовой провод отключал - запитывал аккумулятором. Их много купил в Китае. И программатор.
2 Питание. Элемент литиевый 18650, взял от старого ноута.
Они вот такие.
Батарейку предварительно полностью зарядил. Как заряжать, напишу в другом сообщении.
Преобразователь использовал на микрухе LM2577. Это повышающий от 3,5 В. Выход настроил на 5,1 В. Как раз разрядиться до 3,5В и преобразователь отключится. Полного разряда не произойдет! Плюсовой вывод батарейки отключается выключателем. На схеме не показан.
3 Датчик температуры. DS18B20.
Вот такой. В Китае продается.
DS18B20 это цифровой измеритель температуры, с разрешением
преобразования 9 - 12 разрядов и функцией тревожного сигнала контроля за
температурой. Параметры контроля могут быть заданы пользователем и
сохранены в энергонезависимой памяти датчика.
DS18B20 обменивается данными с микроконтроллером по однопроводной линии связи, используя протокол интерфейса 1-Wire.
Диапазон измерения температуры составляет от -55 до +125 °C. Для диапазона от -10 до +85 °C погрешность не превышает 0,5 °C.
4 Индикация. Пять светодиодов любого цвета. Я взял один зеленый (на знак) и четыре белых (число).
ТЕОРЕТИЧЕСКИЙ БАЗИС
Буду использовать четвертичную систему счисления
. Это которая оперирует цифрами 0, 1, 2, 3 и все!!! Она родственница двоичной. Только двоичные разряды надо сгруппировать парами.
27D=00011011B=00 01 10 11 B=0123(4)
Т.е. 27 число, это 123 в четвертичной.
Нам тогда нужны 4 разряда - это число от 0 до 255 (байт). Для передачи температуры датчика -55 +125 градусов Цельсия в самый раз. 4 разряда - 4 светодиода.
4 градации светодиод может передать запросто. Они даже хорошо различимы на глаз:
0 - не горит. Однако чтобы обозначить светодиод в темноте (чтобы увидеть все четыре разряда), он будет иногда промаргивать.
1 - слабо горит. PWM10/255.
2 - меняется сила света, мигает. Раньше было горит в пол накала PWM127/255, но к сожалению в пол накала на глаз не получается отличить от полного накала ))) Пытался...
3 - горит сильно. Полный накал слишком ярко, использую PWM100/255.
PWM - это pulse-width modulаtions. Это ШИМ по нашему, широтно-импульсная модуляция.
Платы Ардуино на базе микроконтроллеров ATmega328 имеют 6 аппаратных
широтно-импульсных модуляторов. Сигналы ШИМ могут быть сгенерированы на
выводах 3, 5, 6, 9, 10, 11.
Использую 3,5,11,9 - соответственно разряды 0, 1, 2, 3. 6 у меня сгорел раньше от неудачных опытов ))) Это только у меня. Разряды нумеруются с 0го справа налево. Вот так:
3 разряд 2 разряд 1 разряд 0 разряд
0 1 2 3 = 27 градусов
Частота ШИМ Ардуино 488,28 Гц. Разрядность - 8 бит.
Но как перевести температуру в десятичной системе счисления (СС) в четверичную? Используем двоичную математику. Сдвиги вправо и поразрядное И.
Вот наши разряды:
ind0_=int(tmp) & 3;
ind1_=int(tmp)>>2 & 3;
ind2_=int(tmp)>>4 & 3;
ind3_=int(tmp)>>6 & 3;
Т.е. 3 это 00 00 00 11. Поразрядное И дает чистыми только два последних разряда, что нам и надо!!!. А сдиг вправо последовательно на два разряда позволяет получить остальные пары разрядов (старшие, которые правее).
Так: 00 01 10 11 &
00 00 00 11
_________________
00 00 00 11 = 3 - это 0й разряд.
Сдвигаем на два разряда.
00 01 10 11 >> 2 = 00 00 01 10
Далее поразрядное И:
00 00 01 10 &
00 00 00 11
_________________
00 00 00 10 = 2 - это 1й разряд.
И так далее все 4е разряда.
КОД ПРОШИВКИ
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 10
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
int ind0 = 3; //будут аналоговые выходы
int ind1 = 5;
int ind2 = 11;
int ind3 = 9;
int indsgn= 13;
int ind0_;
int ind1_;
int ind2_;
int ind3_;
double tmp;//температура
int sgn;
int i;
void setup(void)
{
// start serial port
Serial.begin(9600);
// Start up the library
sensors.begin();
pinMode(ind0, OUTPUT);
pinMode(ind1, OUTPUT);
pinMode(ind2, OUTPUT);
pinMode(ind3, OUTPUT);
pinMode(indsgn, OUTPUT);
}
void loop(void)
{
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
sensors.requestTemperatures(); // Send the command to get temperatures
tmp=sensors.getTempCByIndex(0);
if(tmp>-60&&tmp<200){//1 если температура хотя бы правдоподобная
i+=10;
if (i>=100) i=10;
Serial.print(millis());Serial.print(" ");Serial.print(tmp);Serial.print(" ");//печатаю ее
sgn=(tmp>0)-(tmp<0);
tmp=abs(tmp);
ind0_=int(tmp) & 3;
ind1_=int(tmp)>>2 & 3;
ind2_=int(tmp)>>4 & 3;
ind3_=int(tmp)>>6 & 3;
if(ind0_==0) {if(i==10) analogWrite(ind0,10); else analogWrite(ind0,0);}
if(ind0_==1) {analogWrite(ind0,10);}
if(ind0_==2) {analogWrite(ind0,i);}
if(ind0_==3) {analogWrite(ind0,100);}
if(ind1_==0) {if(i==10) analogWrite(ind1,10); else analogWrite(ind1,0);}
if(ind1_==1) {analogWrite(ind1,10);}
if(ind1_==2) {analogWrite(ind1,i);}
if(ind1_==3) {analogWrite(ind1,100);}
if(ind2_==0) {if(i==10) analogWrite(ind2,10); else analogWrite(ind2,0);}
if(ind2_==1) {analogWrite(ind2,10);}
if(ind2_==2) {analogWrite(ind2,i);}
if(ind2_==3) {analogWrite(ind2,100);}
if(ind3_==0) {if(i==10) analogWrite(ind3,10); else analogWrite(ind3,0);}
if(ind3_==1) {analogWrite(ind3,10);}
if(ind3_==2) {analogWrite(ind3,i);}
if(ind3_==3) {analogWrite(ind3,100);}
if(sgn<0) digitalWrite(indsgn, HIGH); else digitalWrite(indsgn, LOW);
Serial.print(ind0_);Serial.print(" ");
Serial.print(ind1_);Serial.print(" ");
Serial.print(ind2_);Serial.print(" ");
Serial.print(ind3_);Serial.print(" ");
}//1
Serial.println();
}
ПОРЯДОК ЭКСПЛУАТАЦИИ ПРИБОРА
Включили, он через 2 секунды показывает температуру.
Считали все четыре разряда.
0 - не горит (промаргивает для наглядности.
1 - слабо горит.
2 - меняется сила света, мигает.
3 - горит сильно.
Посмотрели по таблице температуру:
Здесь первые два разряда в самом левом столбце, остальные - в первой строке.
Или по формуле:
ТЕМПЕРАТУРА=3РАЗРЯД*64+2РАЗРЯД*16+1РАЗРЯД*4+0РАЗРЯД
Такую индикацию, думаю, будет видно и за 1 км (возможно). В бинокль. Т.е. считать показания 4-х светодиодов.
Если загорелся знаковый светодиод, то температура отрицательная )))
ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ
1
Сунули под мышку. Показал 0211 (первый светодиод не светит, иногда промаргнивает, второй меняет яркость, третий и четвертый слабо светит). По таблице это 37 градусов. Вы больны, мистер!
2
За окно показал 0013(первые два промаргивают иногда, третий еле светит, а четвертый сильно горит). Это 7 градусов выше нуля. Одевай шапку!
АРХИВ ПРОЕКТА
В папку libraries arduino 1.0.6 киньте две папки OneWire и DallasTemperature, откройте temp1/temp1.ino и вперед, улучшать и модифицировать. Никаких авторских прав! Кроме библиотек OneWire и DallasTemperature, эти авторские )))
https://drive.google.com/open?id=0B1AR0G3hSwPZZGdMMFE0eFFSNVE
ВИДЕО
А надо?