arduino+DS18b20+MAx7219 нужно разобратся
- Войдите на сайт для отправки комментариев
Ср, 23/11/2016 - 23:26
Всем доброго времени суток. Не могу найти удачный пример работы arduino+DS18b20+MAx7219.
Необходимо форматировать данные приходящие с DS ки чтобы раскидать по разрядам. Кто уже сталкивался?
Да, все сталкивались. Чего конкретно надо?
Как мсформировать данные в 4 переменных для вывода на 7сегментник, отделив целые от дробных частей.
В каких "4 переменных" и какие данные? Вы можете изъясняться яснее? А ещё лучше, приведите свой код и объясните что именно у Вас не получается.
float tempC = sensors.getTempC(deviceAddress); // читаем данные ds18b20
Как полученную переменню tempC разделить на 4 переменных (десятки, единицы, десятные, сотые)
Уможьте 100 и присвойте целой переменной (пусть N).
А дальше, как обычно
Сотые - остаток от деления N на 10.
Десятые - остаток от деления "N/10" на 10
Единицы - остаток от деления "N/100" на 10
Десятки - N/1000
Компилято р выдаёт ошибку
А чего ему не выдавать, если функция getTemp не определена? Либо определите, либо, если она библиотечная, правильно используйте. Как именно правильно - я не знаю, скетч-то у Вас секретный и Вы его не показываете.
#include <Time.h> #include <Wire.h> #include <OneWire.h> #include <DallasTemperature.h> #include "RTClib.h" #include "LedControl.h" RTC_DS1307 rtc; //MAX7219 LedControl lc=LedControl(11,13,10,8); unsigned long delaytime=500; //ПЕРЕМЕННЫЕ ДАТЫ // ТЕМПЕРАТУРА #define ONE_WIRE_BUS 2 #define TEMPERATURE_PRECISION 9 float tempC; int integerPart, decimalPart; // 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); // arrays to hold device addresses DeviceAddress insideThermometer, outsideThermometer; //НАСТРОЙКИ void setup() { Serial.begin(9600); #ifdef AVR Wire.begin(); #else Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due #endif rtc.begin(); if (! rtc.isrunning()) { Serial.println("RTC is NOT running!"); // following line sets the RTC to the date & time this sketch was compiled rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // This line sets the RTC with an explicit date & time, for example to set // January 21, 2014 at 3am you would call: //rtc.adjust(DateTime(2016, 11, 19, 19, 50, 0)); } rtc.writeSqwPinMode(SquareWave1HZ); int devices=lc.getDeviceCount(); //we have to init all devices in a loop for(int address=0;address<devices;address++) { /*The MAX72XX is in power-saving mode on startup*/ lc.shutdown(address,false); /* Set the brightness to a medium values */ lc.setIntensity(address,3); /* and clear the display */ lc.clearDisplay(address); } // Start up the library sensors.begin(); sensors.getDeviceCount(); if (sensors.isParasitePowerMode()){ lc.setChar(1,0,'n',false);lc.setChar(1,1,'0',false);} else lc.setChar(1,5,'F',false);lc.setChar(1,6,'F',false);lc.setChar(1,7,'0',false); if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0"); if (!sensors.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1"); // set the resolution to 9 bit per device sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION); sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION); Serial.print("Device 0 Address: "); printAddress(insideThermometer); Serial.println(); Serial.print("Device 1 Address: "); printAddress(outsideThermometer); Serial.println(); } void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { // zero pad the address if necessary if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } } void show_temp(DeviceAddress deviceAddress){ tempC = sensors.getTemp(deviceAddress); // читаем первые 2 байта блокнотаintegerPart = (int)TempC; integerPart= (int)getTemp(); lc.setChar(1,7,0x13,false); lc.setChar(1,6,0x13,false); lc.setChar(1,5,0x13,false); lc.setChar(1,4,'h',false); lc.setChar(1,3,'-',false); lc.setChar(1,2,'-',false); lc.setChar(1,1,'-',false); lc.setChar(1,0,'-',false); delaytime; } void show_date(){ DateTime now = rtc.now(); lc.setChar(1,7,now.day()/10,false); lc.setChar(1,6,now.day()%10,false); lc.setChar(1,5,'-',false); lc.setChar(1,4,now.month()/10,false); lc.setChar(1,3,now.month()%10,false); lc.setChar(1,2,'-',false); lc.setChar(1,1,now.year()%100/10,false); lc.setChar(1,0,now.year() %10,false); } void show_timeS(){ DateTime now = rtc.now(); lc.setIntensity(0,10); lc.setChar(0,7,now.hour()/10,false); lc.setChar(0,6,now.hour()%10,false); lc.setChar(0,5,now.minute()/10,false); lc.setChar(0,4,now.minute()%10,false); lc.setChar(0,3,'-',false); lc.setChar(0,2,now.second()/10,false); lc.setChar(0,1,now.second()%10,false); lc.setChar(0,0,'-',false); } void loop (void) { //show_timeS(); sensors.requestTemperatures(); show_temp(insideThermometer); show_temp(outsideThermometer); delaytime; }Это уже другой (изменённый) скетч. Сообщение было не от него. Вот смотрите, в сообщении было
А в скетче в строке 88 ничего похожего на строку, приведённую в сообщении нет.
Я попробую угадать, что там, но впредь давайте так: если Вам нужна помощь, то Вы показываете скетч и его сообщения, а не заставляется меня головоломки решать.
Итак, в данной версии скетча сообщение по идее должно ругаться не на строку 88, как раньше, а на строку 86
Здесь Вы вызываете функцию getTemp(). Что это за функция? Где она определена? Больше в скетче она нигде не упоминается.
Вот об этом Вам компилятор и говорит, что он не знает такой функции, и не понимает что именно в этом месте должно быть вызвано.
Спасибо за подсказку, действительно из библиотеки версии 3.7.3, функцию вызывал неправильно. Чуть всё подправил, поставил резолюцию 12bit для более плавных показаний.
Ещё такой вопрос: как определить знак отрицательной температуры и сделать смещение знака?
void show_temp(DeviceAddress deviceAddress){ sensors.requestTemperatures(); tempC = sensors.getTempC(deviceAddress); // читаем первые 2 байта блокнотаintegerPart = (int)TempC; tempC = int(tempC*100); digitBuffer[0] = int(tempC)/ 1000; digitBuffer[1] = (int(tempC) % 1000) / 100; digitBuffer[2] = (int(tempC) % 100) / 10; digitBuffer[3] = (int(tempC) % 100) % 10; if(digitBuffer[2]<0){} lc.setChar(1,7,'d',false); lc.setChar(1,6,0x13,false); lc.setChar(1,5,0x13,false); if(digitBuffer[0]!=0){lc.setChar(1,4,digitBuffer[0],false);} else{lc.setChar(1,4,0x13,false);} lc.setChar(1,3,digitBuffer[1],true); lc.setChar(1,2,digitBuffer[2],false); lc.setChar(1,1,'-',false); lc.setChar(1,0,'C',false); delay(750); }Ещё такой вопрос: как определить знак отрицательной температуры и сделать смещение знака?
А как Вы хотите? Сколько места у Вас на индикаторе (сколько разрядов)? Например, если разрядов хватает, то можно, например, вместо Вашего кусочка
написать что-то вроде
tempC = int(tempC*100); int8_t pos = 0; if (tempC < 0) { tempC = -tempC; digitBuffer[pos++] =??? // не знаю как там у Вас сегмент G засвечивается } digitBuffer[pos++] = int(tempC)/ 1000; digitBuffer[pos++] = (int(tempC) % 1000) / 100; digitBuffer[pos++] = (int(tempC) % 100) / 10; digitBuffer[pos++] = (int(tempC) % 100) % 10;При положительном будет всё также, как и раньше, а при отрицательном в разряд 0 попадёт минус (сегмент G), а всё остальное сдвинется вправо.
2 каскадно включённых модуля MAX7219, на символы места хватает.
ну, и делайте, идею я Вам показал