INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
ATTINY85 mit DS18B20 Temperatursensor und echtem Analogausgang
07.01.2015, 21:28 (Dieser Beitrag wurde zuletzt bearbeitet: 21.02.2015 21:13 von ardu_arne.)
Beitrag #1
Star ATTINY85 mit DS18B20 Temperatursensor und echtem Analogausgang
Hallo an alle.

ich hatte in diesem Beitrag eine Möglichkeit genannt wie man mit wenigen Bauteilen einen Messwert von einem DHT22 Feuchtesensor auf einem Analogausgang ausgeben kann.
Daraufhin angemeldete Bedenken ließen auch mich zweifeln ob die vorgeschlagene Lösung machbar ist. Dann hat mich der Ehrgeiz gepackt den Plan in die Tat umzusetzen.
Heute kann ich sagen, dass es funktioniert und will hiermit für alle eine kleine Nachbauanleitung liefern.

Leider hatte ich keinen DHT22 Feuchtesensor und habe deshalb einen DS18B20 Temperaturfühler verwendet. Beide Sensoren verwenden den One-Wire Bus, sodass durch eine Programmanpassung, auch die Verwendung eines DHT22 möglich sein sollte.
Weil ich auch keinen MCP4921 D/A-Wandler hatte wurde dieser durch einen MCP4811 ersetzt. Andere D/A-Wandler mit SPI sollten aber mit kleinen Änderungem im Sketch auch verwendbar sein.

Es gibt einige Hürden die überwunden werden müssen um dem ATTINY85 beizubringen was er tun soll.
Diese sind folgend kurz beschrieben.

Gearbeitet hab ich mit der Arduino IDE1.0.6.

Normalerweise kann man mit der IDE keine Sketche für ATTINY Controller schreiben. Um diese Möglichkeit zu schaffen muss man die IDE etwas ergänzen. Wie das geht steht auf dieser Seite.

Leider hat der ATTINY auch keinen USB Anschluss über den man das Programm aufspielen kann. An der Stelle braucht man dann einen passenden Programmer oder man nutzt einen Arduino UNO den man zu einem "Brenner" für den ATTINY machen kann.
Wie das mit dem UNO gemacht wird steht hier und hier beschrieben.

Die Kommunikation zwischen dem ATTINY85 und dem D/A Wandler erfolgt über eine SPI Schnittstelle. Größere Mikrocontroller besitzen eine Hardware SPI Schnittstelle und die Arduino IDE stellt dafür auch eine Library bereit.
Leider fehlt dem ATTINY aber dieses Hardware SPI. Man kann dem "Kleinen" aber durch Installation dieser SPI library for ATtiny44/84/45/85 auf die Beine helfen. Der darin enthaltene Beispielsketch für den TINY85 war meine Basis zur Anbindung des D/A Wandlers an den ATTINY.

Jetzt galt es noch eine möglichst einfache Lösung für das Auslesen des One-Wire Temperatursensors DS18B20 zu finden. Dazu konnte ich einige Zeilen Code von dieser Webseite verwenden.

Das Ergebnis:
Erst mal der Schaltplan dazu.
   

Auf einem kleinen Breadboard aufgebaut sieht das dann so aus.
   

Leider lief die One-Wire Verbindung zum BS18B20 nicht wenn der ATTINY85 mit 1MHz getaktet wurde. Deshalb muss man den TINY erst mal auf einen internen 8MHz Takt "umfusen".
Dazu schließt man Den TINY85 wie oben beschrieben an den als "Arduino as ISP" vorbereiteten UNO an.
Jetzt kann man den UNO samt dem mit ihm verbundene TINY85 über USB an den PC anschließen und die IDE starten.
Als Board wählt man in der IDE "ATtiny85 (internal 8 MHz clock)"
Als Programmer wird "Arduino as ISP" eingestellt.
Unter "Tools" führt man nun den Punkt "Bootloader installieren" aus.
Hierdurch wird der TINY auf den internen 8MHz Takt umgestellt.


Was jetzt noch fehlt ist der Sketch dazu.
Code:
//Demonstrates use of hardware or software SPI on an ATtiny45/85
//Written using Arduino 1.0.5 with the Arduino-Tiny ATtiny
//core, http://code.google.com/p/arduino-tiny/
//
//Connections:
//  ATtiny85 pin 0 (DIP pin 5, PB0) CS
//  ATtiny85 pin 1 (DIP pin 6, PB1) Data
//  ATtiny85 pin 2 (DIP pin 7, PB2) Clock
//
//
//Jack Christensen 24Oct2013
//
//CC BY-SA:
//This work is licensed under the Creative Commons Attribution-
//ShareAlike 3.0 Unported License. To view a copy of this license,
//visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
//letter to Creative Commons, 171 Second Street, Suite 300,
//San Francisco, California, 94105, USA.

#include <tinySPI.h>               // http://github.com/JChristensen/tinySPI
#include <OneWire.h>

//Pin Definitionen
const int CS_PIN    = 0;           // SPI slave select
const int DATA_PIN  = 1;           // SPI data out
const int CLOCK_PIN = 2;           // SPI clock

#define DS18B20 3                  // Datenpin Temperatursensor
OneWire Sensor(DS18B20);

byte data[12], gain, i;
int16_t raw;
int celsius;


void setup(void)
{
  SPI.begin();                    // start hardware SPI (the library sets up the clock and data pins)
  pinMode(CS_PIN, OUTPUT);        // SPI CS pin needs to be set up
  digitalWrite(CS_PIN, HIGH);
}


void loop(void)
{
  readDS18B20();                   // Temperatur einlesen

  // Umrechnen der vom Temperatursensor gelesenen Daten für den Digital/Analog Wandler
  raw = (data[1] << 8) | data[0];  // Rohdaten von DS18B20 in int umrechnen
  if ( bitRead(raw, 15)) raw = 0;  // bei negativen Temperaturmesswerten auf 0 setzen
  celsius = raw *10 / 32;          // für Ausgabe von 10mV/GrdC umrechnen

  gain = 1;                        // gain=1 Ausgang 0...2,048V - gain=2 Ausgang 0...4,096V
  writeDAC(celsius,gain);          // Analog ausgeben
}    


void writeDAC (int rawData,byte gain)
{
  byte MSByte,LSByte;
  int data;  
  
  data  = rawData & 0x03FF;
  data  = data << 2;  // bei 10Bit MCP4811

  if (gain == 2) data = data | 0x1000;
  else data = data | 0x3000;
  
  MSByte = data >> 8;
  LSByte = data ;
  digitalWrite(CS_PIN, LOW);
  SPI.transfer (MSByte);
  SPI.transfer (LSByte);
  digitalWrite(CS_PIN, HIGH);
}

void readDS18B20 (void)
{
  Sensor.reset();       // reset one wire buss
  Sensor.skip();        // select only device
  Sensor.write(0x44);   // start conversion

  delay(1000);          // wait for the conversion

  Sensor.reset();
  Sensor.skip();
  Sensor.write(0xBE);   // Read Scratchpad
    for ( i = 0; i < 9; i++) {       // 9 bytes
      data[i] = Sensor.read();
    }    
}

Diesen Sketch mittels Copy and Paste in das leere IDE Fenster kopieren.
Wenn alle Ergänzungen für die IDE und die tinySPI-Library richtig installiert wurden, lässt sich das Programm fehlerfrei überprüfen.
Zum brennen auf den TINY85 nutzt man wieder "Arduino as ISP" als Programmer wobei als Board wieder "ATtiny85 (internal 8 MHz clock)" eingestellt wird.

Viele Grüße
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Star Serial Monitor als Debughilfe für den ATtiny85 und andere ATMEL-Mikrocontroller ardu_arne 31 12.322 12.10.2015 11:30
Letzter Beitrag: Bitklopfer
  Arduino mit DS18B20 und MySQL Fried22 48 30.608 10.06.2015 21:01
Letzter Beitrag: Thorsten Pferdekämper
Lightbulb LED Thermometer über WS2812b LED und Dallas DS18B20 Wampo 2 1.722 15.03.2015 17:45
Letzter Beitrag: Wampo
  ATtiny85 Programmierer Gelegenheitsbastler 2 1.775 20.02.2015 21:28
Letzter Beitrag: Gelegenheitsbastler

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste