Как получить температуру от датчика DS18B20 и отобразить ее на рюкзаке Adafruit LED (4x 7 сегментов) с помощью Arduino Yun

В настоящее время я пытаюсь (в течение нескольких часов) отображать температуру, полученную от DS18B20, в моем Adafruit LEDBackpack. Но когда я пытаюсь запустить отображение в настройках (matrix.begin (0x070)), температура, возвращаемая датчиком, всегда равна -127.

Не могли бы вы помочь мне понять, что я сделал не так?

Случаи применения

  1. Только датчик температуры: температура верна
  2. Только экран: экран работает как положено
  3. Оба: Экран работает и отображает ожидаемое значение, НО температура всегда равна -127.

Компоненты:

  • Adafruit LEDBackpack использует I2C, поэтому он подключен к SCL, SDA, 5v, GND
  • Датчик температуры - DS18B20 (1-проводная шина). Это связано с D#2, 5 В, GND

Код

#include <OneWire.h>
#include <DallasTemperature.h>
#include <Bridge.h>
#include <Wire.h> // Enable this line if using Arduino Uno, Mega, etc.
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"

#define ONE_WIRE_BUS 2
#define TEMP_DELAY 2000 // Request temp every two seconds

Adafruit_7segment matrix = Adafruit_7segment();

unsigned long time, lastTempCheck = 0;
float temp = 0;
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

void setup(void)
{
  // start serial port
  Serial.begin(9600);

  // Start up the library
  sensors.begin(); 
  matrix.begin(0x70); // If I comment this and do not use the matrix, the temperature is correct.
}

void loop(void)
{ 
  time = millis();

  if((time - lastTempCheck) > TEMP_DELAY){
    lastTempCheck = time;
    processTemp();
  }else { 
  matrix.print(100);
  matrix.writeDisplay();
  }
}

void processTemp(void){
  sensors.requestTemperatures(); // Send the command to get temperatures
  temp = sensors.getTempCByIndex(0);
  Serial.print("Temperature: ");
  Serial.println(temp);
}

схема

схема

2 ответа

Попробуйте дать каждому компоненту собственный источник питания (т.е. светодиод - 3 В и датчик - 5 В). Каждый вывод может выдавать столько энергии, чтобы остановить повреждение платы. Светодиод может получать питание от датчика, а у датчика может не хватить мощности для правильной работы.

На вашей электрической схеме показано короткое замыкание над (+) и (-) контактами (ножками) DS18B20 - этим коротким горизонтальным проводом под резистором. Значение -127.0 указывает на проблему с датчиком температуры.

Так что, если это реальная проблема (не только на диаграмме), удалите этот провод, чтобы исправить это. Кроме того, в вашей настройке (), вы можете добавить какую-то проверку, что ваши датчики исправны перед циклом:

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS    2  // Arduino pin D2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

setup()
{
    Serial.begin(115200);
    Serial.println("setup() runs ...");

    sensors.begin();
    if (sensors.getDeviceCount() < 1)
    {
        Serial.println("DS18B20 Error - No sensors found");
    }
}

// ... rest of code
Другие вопросы по тегам