Перейти к содержанию

Шура Калитуха

Members
  • Постов

    1
  • Зарегистрирован

  • Посещение

Достижения Шура Калитуха

Новичок

Новичок (1/14)

  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

0

Репутация

  1. Хочется винтажную погодную станцию. Пробую объединить http://mypractic.ru/urok-26-podklyuchenie-termodatchikov-ds18b20-k-arduino-biblioteka-onewire-tochnyj-arduino-termometr-registrator.html#comment-6863 иhttps://arduino-ua.com/art24-vintajnii-barometr. // термометр, датчик DS18B20 #include <MsTimer2.h> #include <Led4Digits.h> #include <OneWire.h> #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,16,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); // датчик подключен к выводу 15 int timeCount; // счетчик времени измерения boolean flagSensReady; // признак готовности данных с датчика byte bufData[9]; // буфер данных float temperature; // измеренная температура void setup() { press_data.begin(); //подключаемся к датчику press_data.begin(); pinMode(mA, OUTPUT); MsTimer2::set(2, timerInterrupt); // задаем период прерывания по таймеру 2 мс MsTimer2::start(); // разрешаем прерывание по таймеру Serial.begin(9600); // инициализируем порт, скорость 9600 } void loop() { 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; } } { 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); } } //-------------------------------------- обработчик прерывания 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 && timeCount <= 491) bufData[timeCount - 483 ] = sensDs.read(); } Получилось это. Работает только градусник. Убираю прерывания работает только барометр. В программировании ноль. Собирал методом "научного тыка" Помогите, кто может. Спасибо!
×
×
  • Создать...