Градусник с барометром

Вопросы по средствам измерения температуры
rf68
Сообщения: 2
Зарегистрирован: 11 авг 2017, 23:39

Градусник с барометром

Сообщение rf68 » 11 авг 2017, 23:56

решил соеденить два проекта: урок 26 и винтажный барометр
получилось это

Код: Выделить всё

// термометр, датчик DS18B20
#include <MsTimer2.h>
#include <Led4Digits.h>
#include <OneWire.h>
#include <Wire.h> //Библиотека для работы с I2C

#include <Adafruit_BMP085.h> //Библиотека для датчика давления

Adafruit_BMP085 press_data; //переменная для работы с датчиком

byte mA = 3;

int tmp;

float Pmm; //для хранения показаний давления

float Tc; //для хранения температуры

#define POWER_MODE 0 // режим питания, 0 - внешнее, 1 - паразитное
#define MEASURE_PERIOD 500 // время измерения, * 2 мс

// тип индикатора 1; выводы разрядов 5,4,3,2; выводы сегментов 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,16,2, 6,7,8,9,10,11,12,13);

OneWire sensDs (15); // датчик подключен к выводу 14

int timeCount; // счетчик времени измерения
boolean flagSensReady; // признак готовности данных с датчика
byte bufData[9]; // буфер данных
float temperature; // измеренная температура

void setup() {
press_data.begin(); //подключаемся к датчику

press_data.begin();

pinMode(mA, OUTPUT);


M// термометр, датчик DS18B20
#include <MsTimer2.h>
#include <Led4Digits.h>
#include <OneWire.h>
#include <Wire.h> //Библиотека для работы с I2C

#include <Adafruit_BMP085.h> //Библиотека для датчика давления

Adafruit_BMP085 press_data; //переменная для работы с датчиком

byte mA = 3;

int tmp;

float Pmm; //для хранения показаний давления

float Tc; //для хранения температуры

#define POWER_MODE 0 // режим питания, 0 - внешнее, 1 - паразитное
#define MEASURE_PERIOD 500 // время измерения, * 2 мс

// тип индикатора 1; выводы разрядов 5,4,3,2; выводы сегментов 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,16,2, 6,7,8,9,10,11,12,13);

OneWire sensDs (15); // датчик подключен к выводу 14

int timeCount; // счетчик времени измерения
boolean flagSensReady; // признак готовности данных с датчика
byte bufData[9]; // буфер данных
float temperature; // измеренная температура

void setup() {
press_data.begin(); //подключаемся к датчику

press_data.begin();

pinMode(mA, OUTPUT);


MsTimer2::set(5, timerInterrupt); // задаем период прерывания по таймеру 2 мс
MsTimer2::start(); // разрешаем прерывание по таймеру
Serial.begin(9600); // инициализируем порт, скорость 9600
}

void loop() {

{

Tc=press_data.readTemperature(); //читаем температуру

Pmm=press_data.readPressure()/133.322; //читаем и пересчитываем давление

//выводим в порт

Serial.print("C= ");

Serial.print(Tc);

Serial.print(" P= ");

Serial.println(Pmm);

delay(1000); //ждем 1 секунду

Pmm=map(Pmm, 700, 800, 0, 255);

analogWrite(mA, Pmm);



}
if ( flagSensReady == true ) {
flagSensReady= false;
// данные готовы

if ( OneWire::crc8(bufData, 8) == bufData[8] ) { // проверка CRC
// данные правильные
temperature= (float)((int)bufData[0] | (((int)bufData[1]) << 8)) * 0.0625 + 0.03125;

// вывод измеренной температуры на индикаторы
if (temperature >= 0) {
// температура положительная
disp.print((int)(temperature * 10.), 4, 1);
}
else {
// температура отрицательная
disp.print((int)(temperature * -1 * 10.), 3, 1);
disp.digit[3]= 0x40; // отображается минус
}
disp.digit[1] |= 0x80; // зажечь точку второго разряда

// передача температуры на компьютер
Serial.println(temperature);
}
else {
// ошибка CRC, отображается ----
disp.digit[0]= 0x40;
disp.digit[1]= 0x40;
disp.digit[2]= 0x40;
disp.digit[3]= 0x40;
}


}


}



//-------------------------------------- обработчик прерывания 2 мс
void timerInterrupt() {
disp.regen(); // регенерация индикатора

// управление датчиком DS18B20 паралллельным процессом
timeCount++; if ( timeCount >= MEASURE_PERIOD ) { timeCount=0; flagSensReady=true; }

if (timeCount == 0) sensDs.reset(); // сброс шины
if (timeCount == 1) sensDs.write(0xCC, POWER_MODE); // пропуск ROM
if (timeCount == 2) sensDs.write(0x44, POWER_MODE); // инициализация измерения

if (timeCount == 480) sensDs.reset(); // сброс шины
if (timeCount == 481) sensDs.write(0xCC, POWER_MODE); // пропуск ROM
if (timeCount == 482) sensDs.write(0xBE, POWER_MODE); // команда чтения памяти датчика

if (timeCount == 483 ) bufData[0]= sensDs.read(); // чтение памяти датчика
if (timeCount == 484 ) bufData[1]= sensDs.read(); // чтение памяти датчика
if (timeCount == 485 ) bufData[2]= sensDs.read(); // чтение памяти датчика
if (timeCount == 486 ) bufData[3]= sensDs.read(); // чтение памяти датчика
if (timeCount == 487 ) bufData[4]= sensDs.read(); // чтение памяти датчика
if (timeCount == 488 ) bufData[5]= sensDs.read(); // чтение памяти датчика
if (timeCount == 489 ) bufData[6]= sensDs.read(); // чтение памяти датчика
if (timeCount == 490 ) bufData[7]= sensDs.read(); // чтение памяти датчика
if (timeCount == 491 ) bufData[8]= sensDs.read(); // чтение памяти датчика

}


работает только градусник. Убираю прерывание
MsTimer2::set(5, timerInterrupt); // задаем период прерывания по таймеру 2 мс
MsTimer2::start(); // разрешаем прерывание по таймеру
работает только барометр.
пробовал вывести температуру сразу с датчика давления не получилось. это второй мой проект. Помогите кто может
Спасибо


Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Градусник с барометром

Сообщение Эдуард » 12 авг 2017, 00:12

Здравствуйте!
Попробуйте оставьте прерывание и в нем только disp.regen();. Все, что касается датчика DS18B20 уберите. Будет работать?

Если барометр заработает, то нормальная работа функции press_data.readPressure нарушается довольно длинными вызовами функций чтения DS18B20.
Надо изменить структуру программы. В прерывании от таймера оставить только регенерацию LED индикаторов. А в основном цикле выполнять синхронно запуск измерения DS18B20, затем чтение барометра, пауза для завершения преобразования DS18B20 и чтение DS18B20.
Сделать это можно асинхронно по отношению к прерываниям (с помощью delay) или синхронно, как это сделано в контроллере элемента Пельтье (урок 38). Начните с простого варианта.

rf68
Сообщения: 2
Зарегистрирован: 11 авг 2017, 23:39

Re: Градусник с барометром

Сообщение rf68 » 12 авг 2017, 15:30

оставил disp.regen не заработало. Разбираюсь с уроком 38. А если брать температуру с датчика давления? Пробовал, не получается

Аватара пользователя
AlexCo
Сообщения: 18
Зарегистрирован: 01 мар 2017, 21:34

Re: Градусник с барометром

Сообщение AlexCo » 03 янв 2018, 19:54

Если посмотреть на код, что вы предоставили то у вас код одного примера вставлен в функцию setup другого примера, почти все повторяется, нужно убрать повторы как минимум...


Вернуться в «Датчики температуры»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей