Max7219 и десятичная точка
- Войдите на сайт для отправки комментариев
Чт, 17/05/2012 - 08:47
Есть драйвер индикатора Мах7219 и 3-х цифровой 7 сегментный индикатор.
Небходимо вывести температуру от датчика 18b20 с точностью 1/10.
Пробывал разные варианты но не получается
Подскажите как правильно это сделать
Програмист я неопытный поэтому желательно с примером
Зараннее спасибо.
#include <OneWire.h> //
#include <DallasTemperature.h>
#include "LedControl.h" //
LedControl lc=LedControl(12,11,10,1); //
// pin 12 is connected to the MAX7219 pin 1
// pin 11 is connected to the CLK pin 13
// pin 10 is connected to LOAD pin 12
// 1 as we are only using 1 MAX7219
OneWire ds(8);
float T; //переменная для хранения температуры
int T1; // переменная текущей температуры
int ones;
int tens;
int hundreds;
void setup()
{
lc.clearDisplay(0);// clear screen
lc.shutdown(0,false);// turn off power saving, enables display
lc.setIntensity(0,7);// sets brightness (0~15 possible values)
lc.setScanLimit(1, 3);
}
void loop()
{
byte data[12]; // массив для хранения принимаемых от датчика данных
byte i;
//работа с 1Wire
ds.reset(); // любой обмен начинается с импульса reset
ds.write(0xCC,1); // т.к. датчик пока один то будем обращаться к нему не по
// адресу, а используя команду "пропуск ROM" (0xCC)
ds.write(0x44,1); // 0x44 - команда на конвертирование температуры
delay(1000); // ждем 1 с (время на конвертацию температуры)
ds.reset();
ds.write(0xCC,1); // пропуск ROM
ds.write(0xBE); // команда на считывание ОЗУ датчика
for ( i = 0; i < 9; i++) { // считываем 9 байт (достаточно 2-х)
data[i] = ds.read();
}
T = float((data[1] << 8) + data[0])/16; //конвертируем 2 байта в десятичное значение температуры
T1 = T*10;
hundreds = T1/100;
tens=(T1-hundreds*100)/10;
ones=T1-(hundreds*100+tens*10);
lc.setDigit(0,0,hundreds,false);
lc.setDigit(0,1,tens,true); / сюда и надо вставить светящуюся точку во 2 разряде
lc.setDigit(0,2,ones,false);
// lc.setDigit(0,1,(tens & '.'),true);
// lc.setChar(0,1,',',true);
}
что именно не получается ?
на Serial датчик температуры правильно кажет?
на сериал показывает точно - но на индикаторах показывает с ошибкой при нагревании и охлаждении температуру показывает десятки и десятые нормально а единицы - четные цифры . Вот такая хрень ...
1. А зачем вы сами, руками, читаете датчик, если уже подключили библиотеку DallasTemperature. Она же может эту "грязную работу" сделать за вас.
2. Убедитесь что у вас свежая версия библиотеки. http://milesburton.com/Dallas_Temperature_Control_Library, там же и пример найти можно.
3. В строке 65, выведите в сериал T,hundreds,tens,ones и напишите тут, что видите в Serial (нужно определится что-то неправильно вычисляем или неправильно LCD рулим). И что при этом видите на LCD
leshak
Спасибо за подсказку!
Все заработало как надо!
Окончательный скетч
Arduino + 18b20 + max7219 +АЛС318
#include <LedControl.h> #include <OneWire.h> #include <DallasTemperature.h> LedControl lc=LedControl(12,11,10,1); #define ONE_WIRE_BUS 8 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); float T; //переменная для хранения температуры int T1; // переменная текущей температуры int ones; int tens; int hundreds; void setup() { lc.clearDisplay(0);// clear screen lc.shutdown(0,false);// turn off power saving, enables display lc.setIntensity(0,7);// sets brightness (0~15 possible values) lc.setScanLimit(1, 3); sensors.begin(); } void loop(void) { sensors.requestTemperatures(); // Send the command to get temperatures T=(sensors.getTempCByIndex(0)); T1 = T*10; hundreds = T1/100; tens=(T1-hundreds*100)/10; ones=T1-(hundreds*100+tens*10); lc.setDigit(0,0,hundreds,false); lc.setDigit(0,1,tens,true); lc.setDigit(0,2,ones,false); }