Hallo liebe Community,
ich stehe vor folgenden Problem, ich versuche einen DS18B20 auszulesen leider bisher ohne großen Erfolg. Denn es wären -127 Grad jedenfalls nach dem Sensor zu urteilen. Habe folgenden Programmcode auf den AT laufen:
C
#include <avr/sleep.h>
#include <SoftwareSerial.h>
#include <OneWire.h>
#include <DallasTemperature.h>
//------------------------------------------------------------------------------
#define SENDDELAY 300 // wait this many ms between sending packets
#define SERIAL_BAUD 9600
//------------------------------------------------------------------------------
// PIN-Konfiguration
//------------------------------------------------------------------------------
// UART
#define rxPin 7 // D7, PA3
#define txPin 8 // D3, PA7
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// PIN-Konfiguration
//------------------------------------------------------------------------------
// SENSOR pins
#define ONE_WIRE_BUS 10 // DS18B20 Temperature sensor is connected on D10/ATtiny pin 13
#define ONE_WIRE_POWER 9 // DS18B20 Power pin is connected on D9/ATtiny pin 12
//------------------------------------------------------------------------------
/*
+-\/-+
VCC 1| |14 GND
(D0) PB0 2| |13 AREF (D10)
(D1) PB1 3| |12 PA1 (D9)
RESET 4| |11 PA2 (D8)
INT0 PWM (D2) PB2 5| |10 PA3 (D7)
PWM (D3) PA7 6| |9 PA4 (D6)
PWM (D4) PA6 7| |8 PA5 (D5) PWM
+----+
*/
SoftwareSerial mySerial(rxPin, txPin);
char msg[26];
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup() {
mySerial.begin(SERIAL_BAUD);
mySerial.println("Transmitting...\n");
delay(100);
PRR = bit(PRTIM1); // only keep timer 0 going
ADCSRA &= ~ bit(ADEN); bitSet(PRR, PRADC); // Disable the ADC to save power
delay(100);
// Start up the library
sensors.begin();
}
//--------------------------------------------------------------------------------------------------
// Read current supply voltage
//--------------------------------------------------------------------------------------------------
long readVcc() {
//bitClear(PRR, PRADC);
//ADCSRA |= bit(ADEN); // Enable the ADC
long result;
// Read 1.1V reference against Vcc
ADMUX = _BV(MUX5) | _BV(MUX0); // For ATtiny84
delay(2); // Wait for Vref to settle
ADCSRA |= _BV(ADSC); // Convert
while (bit_is_set(ADCSRA,ADSC));
result = ADCL;
result |= ADCH<<8;
result = 1126400L / result; // Back-calculate Vcc in mV
//ADCSRA &= ~ bit(ADEN);
//bitSet(PRR, PRADC); // Disable the ADC to save power
return result;
}
void loop() {
pinMode(ONE_WIRE_POWER, OUTPUT); // set power pin for DS18B20 to output
digitalWrite(ONE_WIRE_POWER, HIGH); // turn DS18B20 sensor on
delay(100); // Allow 50ms for the sensor to be ready
sensors.requestTemperatures(); // Send the command to get temperatures
int temp = sensors.getTempCByIndex(0)*100; // read sensor 1
//String temp2=(sensors.getTempCByIndex(1)*100); // read second sensor.. you may have multiple and count them upon startup but I only need one
int supplyV = readVcc(); // Get supply voltage
digitalWrite(ONE_WIRE_POWER, LOW); // turn Sensor off to save power
pinMode(ONE_WIRE_POWER, INPUT); // set power pin for Sensor to input before sleeping, saves power
// msg-Variable mit Daten zum Versand fuellen, die spaeter an das WebScript uebergeben werden
strcpy(msg,"v=");
itoa(supplyV,&msg[strlen(msg)],10);
strcat(msg,"&t=");
itoa(temp,&msg[strlen(msg)],10);
mySerial.print("Sending: ");
mySerial.println(msg);
delay(SENDDELAY);
}
Alles anzeigen
Und der Sensor ist wie meigrafd beschrieben hat angeschlossen, ich lasse mir die Daten per UARC an den Raspberry schicken Daten lauten wie folgt: Sending: v=-1&t=-12700. Deshalb nicht die anderen Bauteile auf der Zeichnung beachten nur den Sensor und den ATTiny. Und die Stromversorgung macht der RaspberryPI mit einen 3v3 Ausgang.