Använd DS18B20 temperatursensor med Arduino - LCD display

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Albireo
Inlägg: 73
Blev medlem: 30 november 2019, 00:29:39

Använd DS18B20 temperatursensor med Arduino - LCD display

Inlägg av Albireo »

Försöker koppla ihop ett Arduino UNO system, med en Dallastemperatursensor - DS18B20 (samt en LCD-display och ett nätverkskort med micro SD-kort - än så länge bara inkopplade)

Men något har gått snett... Något jag inte förstår eller kan hantera?
Följde bl.a. dessa länkar .: How to Use DS18B20 Temperature Sensor - Arduino Tutorial samt DS18B20 (Digital Temperature Sensor) and Arduino

Men när jag skulle installera OneWire.h och DallasTemperature.h halkade jag in på ett annat system OneWire Library(men upptäckte försent att detta är nog något helt annat?)

Frågor & funderingar!
- Har inte förstått hur jag ska hitta adressen på den dallasgivare jag har.
- Vilka bibliotek som passar en Arduino UNO (i min konfiguration)
- Söker ett testprogram för att testa uppkopplingen med tempgivaren.
- Hur ominstalleras Arduino? (kommer tidigare bibliotek att försvinna?)

Har försökt få ett resultat från olika testprogram jag hittat. Ett ex.:

Kod: Markera allt

/* Arduino DS18B20 temp sensor tutorial
   More info: http://www.ardumotive.com/how-to-use-the-ds18b20-temperature-sensor-en.html
   Date: 19/6/2015 // www.ardumotive.com */


//Include libraries
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 2
// 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);

void setup(void)
{
  Serial.begin(115200); //Begin serial communication
  Serial.println("Arduino Digital Temperature // Serial Monitor Version"); //Print a message
  sensors.begin();
}

void loop(void)
{ 
  // Send the command to get temperatures
  sensors.requestTemperatures();  
  Serial.print("Temperature is: ");
  Serial.println(sensors.getTempCByIndex(0)); // Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
  //Update value every 1 sec.
  delay(1000);
}
Detta program skapar inga felmeddelanden vid kompilering.
Men när programmet skall överföras till Arduinon (via USB - com3) uppstår mängd felmeddelanden .:
Error - Aduino - Dallasgivare.jpg
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Henry
Inlägg: 23621
Blev medlem: 20 april 2005, 02:52:47
Ort: Lund

Re: Använd DS18B20 temperatursensor med Arduino - LCD displa

Inlägg av Henry »

Och du har valt just Arduino UNO i IDE:t? För det ser ut som den förväntar sig en Arduino Butterfly eller nåt.

Har sedan fööör mig att det finns ett testprogram för att hitta adressen i Dallas mappen med exempel sketcher, orkar inte starta upp Arduino för en koll.
larky
Inlägg: 1100
Blev medlem: 7 mars 2007, 07:54:18
Ort: Skellefteå
Kontakt:

Re: Använd DS18B20 temperatursensor med Arduino - LCD displa

Inlägg av larky »

DS18x20_Temperaturetest.txt
Den här filen hade jag liggande för att lista givare.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Albireo
Inlägg: 73
Blev medlem: 30 november 2019, 00:29:39

Re: Använd DS18B20 temperatursensor med Arduino - LCD displa

Inlägg av Albireo »

Tack!
Henry skrev:... valt just Arduino UNO i IDE:t? För det ser ut som den förväntar sig en Arduino Butterfly eller nåt....
(såg inte att det hade ändrats från UNO. - Måste inträffat vid någon ominstallation av Arduino editorn.)
Har plockat bort allt från UNO:n - Nu fungerar "blinkande LED" igen. :)

1) Laddade ned biblioteken OneWire-2.3.5.zip (samt DallasTemperature-3.8.0.zip)

2) Kopplade in tempgivaren DS18B20 på Arduino UNO - digital pin4 (inte enligt schema - pin2) med pullup motståndet på 4,7kΩ
Schema - Dallasgivare.jpg
3) Koden från @Larky ovan .: DS18x20_Temperaturetest.txt kopierades in i Arduino editorn.
När koden kompileras uppstår följande tre fel (information som inte tillför något har rensats bort).:
Arduino:1.8.10 (Windows 10), Kort:"Arduino Uno" The sketch name had to be modified.

Check_OneWire_ID:10:13: error: 'D4' was not declared in this scope
OneWire ds(D4); // on pin 4 (a 4.7K resistor is necessary)
C:\...\Check_OneWire_ID.ino:10:13: note: suggested alternative: 'A4'

Multiple libraries were found for "OneWire.h"
Använd: C:\...\Dokument\Arduino\libraries\OneWire-2.3.5
exit status 1
'D4' was not declared in this scope

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.
Fel a) Vet inte vad som är fel med filnamnet .: Check_OneWire_ID.ino
Sketch names must start with a letter or number, followed by letters, numbers, dashes, dots and underscores. Maximum length is 63 characters.

Fel b) (ändrade kommentar från pin 10 till pin 4) samt införde följande instruktion .:

Kod: Markera allt

int D4 = 4;
OneWire  ds(D4);  // on pin 4 (a 4.7K resistor is necessary)
Fel c) Hur "Multiple libraries were found for "OneWire.h"" ska hanteras eller hur det uppkommit - vet ej!
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Albireo
Inlägg: 73
Blev medlem: 30 november 2019, 00:29:39

Re: Använd DS18B20 temperatursensor med Arduino - LCD displa

Inlägg av Albireo »

Knölade och sökte men hittade ingen förklaring till de fel som uppstått.
Ändrade endast lite i programmet från @Larky (fel b). Resultatet blev följande kod .:

Kod: Markera allt

#include <OneWire.h>

// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library

int D4 = 4;
OneWire  ds(D4);  // on pin 4 (a 4.7K resistor is necessary)

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();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      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, 1);        // start conversion, with parasite power on at the end
  
  delay(2000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.println(" Celsius, ");
 // Serial.print(fahrenheit);
  //Serial.println(" Fahrenheit");
}
Och helt plötsligt var alla fel (a, b, c) borta! :bravo:
Jag trodde det var "svåra" fel...

Resultatet i Arduinos serie monitor "poppar" följande meddelande upp hela tiden, som förväntat. (har inte testat flera OneWire samtidigt inkopplade.)
16:13:02.918 -> ROM = 28 5B 3B 79 97 20 3 76
16:13:02.918 -> Chip = DS18B20
16:13:04.933 -> Data = 1 8E 1 55 5 7F A5 A5 66 59 CRC=59
16:13:04.980 -> Temperature = 24.87 Celsius,
16:13:04.980 -> No more addresses.
Toppen!
Skriv svar