arduino+DS18b20+MAx7219 нужно разобратся

ardo
Offline
Зарегистрирован: 23.11.2016

Всем доброго времени суток. Не могу найти удачный пример работы arduino+DS18b20+MAx7219.

Необходимо форматировать данные приходящие с DS ки чтобы раскидать по разрядам. Кто уже сталкивался?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, все сталкивались. Чего конкретно надо? 

ardo
Offline
Зарегистрирован: 23.11.2016

Как мсформировать данные в 4 переменных для вывода на 7сегментник, отделив целые от дробных частей.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В каких "4 переменных" и какие данные? Вы можете изъясняться яснее? А ещё лучше, приведите свой код и объясните что именно у Вас не получается.

ardo
Offline
Зарегистрирован: 23.11.2016

float tempC = sensors.getTempC(deviceAddress); // читаем данные ds18b20

Как полученную переменню tempC разделить на 4 переменных (десятки, единицы, десятные, сотые)

lc.setChar(1,4,'десятки',false);//4 разряда 7ми сегментника
lc.setChar(1,3,'единицы',false);
lc.setChar(1,2,'десятые',false);
lc.setChar(1,1,'сотые',false);

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Уможьте 100 и присвойте целой переменной (пусть N).

А дальше, как обычно

Сотые - остаток от деления N на 10.

Десятые - остаток от  деления "N/10" на 10

Единицы - остаток от  деления "N/100" на 10

Десятки - N/1000

 

ardo
Offline
Зарегистрирован: 23.11.2016

 

Компилято р выдаёт ошибку

int integerPart= (int)getTemp();
C:\Arduino\timeweather\timeweather.ino: In function 'void show_temp(uint8_t*)':
 
timeweather:88: error: 'getTemp' was not declared in this scope
 
 integerPart= (int)getTemp();
 
                           ^
 
exit status 1
'getTemp' was not declared in this scope
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А чего ему не выдавать, если функция getTemp не определена? Либо определите, либо, если она библиотечная, правильно используйте. Как именно правильно - я не знаю, скетч-то у Вас секретный и Вы его не показываете.

ardo
Offline
Зарегистрирован: 23.11.2016
#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;
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Это уже другой (изменённый)  скетч. Сообщение было не от него. Вот смотрите, в сообщении было

timeweather:88: error: 'getTemp' was not declared in this scope
 
 integerPart= (int)getTemp();

А в скетче в строке 88 ничего похожего на строку, приведённую в сообщении нет.

Я попробую угадать, что там, но впредь давайте так: если Вам нужна помощь, то Вы показываете скетч и его сообщения, а не заставляется меня головоломки решать.

Итак, в данной версии скетча сообщение по идее должно ругаться не на строку 88, как раньше, а на строку 86

integerPart= (int)getTemp();

Здесь Вы вызываете функцию getTemp(). Что это за функция? Где она определена? Больше в скетче она нигде не упоминается.

Вот об этом Вам компилятор и говорит, что он не знает такой функции, и не понимает что именно в этом месте должно быть вызвано.

ardo
Offline
Зарегистрирован: 23.11.2016

Спасибо за подсказку, действительно из библиотеки версии 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); 
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ardo пишет:

Ещё такой вопрос: как определить знак отрицательной  температуры и сделать смещение знака?

А как Вы хотите? Сколько места у Вас на индикаторе (сколько разрядов)? Например, если разрядов хватает, то можно, например, вместо Вашего кусочка

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;

написать что-то вроде

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), а всё остальное сдвинется вправо.

ardo
Offline
Зарегистрирован: 23.11.2016

2 каскадно включённых модуля MAX7219, на символы места хватает.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ну, и делайте, идею я Вам показал