Регистр температуры окружающей среды

Тема в разделе "Arduino & Shields", создана пользователем Bizya, 10 дек 2016.

  1. Bizya

    Bizya Нуб

    Нужно сделать прибор, который будет выводить температуру на лсд экран. При этом при определенном пороге температуры должен загораться светодиод либо синим, либо красным. Сам порог вводить с кнопок.
    Сделал все, кроме кнопок. Не могу понять как вводить с них данные. Вот код и схема. uTiLRn_cYM0.jpg
    Код (C++):
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
    #include <OneWire.h>





    OneWire ds(10); // на пине 10 (нужен резистор 4.7 КОм)

    void setup(void) {
     

    Serial.begin(9600);

    }

    void loop(void) {
     
    byte i;
    byte present = 0;
    byte type_s;
    byte data[12];
    byte addr[8];
    float celsius, fahrenheit;
    if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;

    }

    Serial.print("ROM =");
    for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);

    }

    if (OneWire::crc8(addr, 7) != addr[7]) {
    Serial.println("CRC is not valid!");
    return;

    }

    Serial.println();
    switch (addr[0]) {
    case 0x10:
    Serial.println(" Chip = DS18S20");
    type_s = 1;
    break;
    case 0x28:
    Serial.println(" Chip = DS18B20");
    type_s = 0;
    break;
    case 0x22:
    Serial.println(" Chip = DS1822");
    type_s = 0;
    break;
    default:
    Serial.println("Device is not a DS18x20 family device.");
    return;

    }

    ds.reset();
    ds.select(addr);
    ds.write(0x44);
    present = ds.reset();
    ds.select(addr);
    ds.write(0xBE);
    Serial.print(" Data = ");
    Serial.print(present, HEX);
    Serial.print(" ");
    for ( i = 0; i < 9; i++) {
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");

    }

    Serial.print(" CRC=");
    Serial.print(OneWire::crc8(data, 8), HEX);
    Serial.println();
    int16_t raw = (data[1] << 8) | data[0];
    if (type_s) {
    raw = raw << 3;
    if (data[7] == 0x10) {
    raw = (raw & 0xFFF0) + 12 - data[6];

    }

    } else {

    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7;
    else if (cfg == 0x20) raw = raw & ~3;
    else if (cfg == 0x40) raw = raw & ~1;



    }

    celsius = (float)raw / 16.0;
    fahrenheit = celsius * 1.8 + 32.0;
    lcd.print(" Temperature = ");
    lcd.print(celsius);
    lcd.print(" Celsius, ");
    lcd.print(fahrenheit);
    lcd.println(" Fahrenheit");

    }
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    неужели температура корректно показывается?
    Интервал между замерами должен быть минимум 0,75 сек, а в коде идет постоянная долбежка датчика (он от этого чуть греется и показания уже не истинные).
    а где же переменная для порогового уровня, где управление светодиодом, где подключение кнопки?