Guten Tag Arduino Fans, habe ein rätselhaftes Problem das ich seit ein paar Tage nicht lösen kann. Also ich habe ein Sender mit Hilfe eines ATTINY85 + DS18S20+433MHz Gebaut , wie man im Sketch sieht geht der Winzling nach dem senden eine Weile schlafen. Wacht auf und sendet die Temperatur erneut. Mein Problem er sendet immer 127° , das kuriose wen ich im Sketch die Stromspargeschichte weglasse sendet er die richtige Temperatur. Benutze ich aber einen DS18B20(natürlich ist die Abfrage auf den 18B20 angepasst) läuft alles Super. Bin einfach ratlos, habe das Netz auch nach anderen Möglichkeiten durchsucht aber nichts gefunden oder ähnlichen fällen ... es liegt denke ich an der avr/sleep.h und avr/wdt.h + DS18S20 hat jemand das Problem gehabt???? Und die Delay(xxx); hat überhaupt keine Auswirkung im Programm egal was ich da eingebe Delay(100) oder Delay(10000) auch komisch..
/ ATtiny85 + DS18S20 sensor
#include <VirtualWire.h>
#include <OneWire.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
int HighByte, LowByte, TReading, SignBit, Tc_100, Fract , Whole;
int led = PB0;//PB0
int sen = PB1;//++ Sensor
int sender = PB2;//++ sender
float temp;
char msg[20];
volatile boolean f_wdt = 1;
OneWire ds(3); // 1-wire bus D4
// 10 D5 3A E 3 8 0 6A DS18S20 Familie ohne 4,7k
byte addr[8]={0x10, 0xD5, 0x3A, 0x0E, 0x03, 0x08, 0x00, 0x6A}; //loose sensor #1
void setup(void) {
pinMode(led, OUTPUT);
pinMode(sender, OUTPUT);
pinMode(sen, OUTPUT);
vw_set_ptt_inverted(true); // Required for RF Link module
vw_setup(2000); // Bits per sec
vw_set_tx_pin(4); // pin x 433 empfänger
setup_watchdog(9); // approximately 8 seconds sleep
}
void loop(void)
{
abfrage();
// loop around and give delay of 2 * 9sec = 18 sec
for (int myLoop= 0; myLoop < 2; myLoop++) {
// reset flag
if (f_wdt==1) { // wait for timed out watchdog / flag is set when a watchdog timeout occurs
f_wdt=0; }
system_sleep();
}
delay(500);
}//ende loop
// set system into the sleep state
// system wakes up when wtchdog is timed out
void system_sleep() {
cbi(ADCSRA,ADEN); // Schalter Analog zu Digitalwandler AUS
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Sleep-Modus wird hier eingestellt
sleep_enable();
sleep_mode(); // System schläft hier
sleep_disable(); // Das System setzt die Ausführung hier fort, wenn die Watchdog-
sbi(ADCSRA,ADEN); // Schalter Analog zu Digitalwandler An
}
void abfrage()
{
pinMode(led, OUTPUT);
pinMode(sen, OUTPUT);
pinMode(sender, OUTPUT);
digitalWrite(led, HIGH);
digitalWrite(sen, HIGH);
digitalWrite(sender, HIGH);
delayMicroseconds (3000);
byte i;
byte present = 0;
byte data[12];
ds.reset();
ds.select(addr);
ds.write(0x44,0); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
//ds.depower();
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++)
{ // we need 9 bytes
data[i1] = ds.read();
}
LowByte = data[0];
HighByte = data[1];
TReading = (HighByte << 8)+ LowByte;
SignBit = TReading & 0x8000; // test most sig bit
if (SignBit) // negative
{
TReading = (TReading ^ 0xffff) + 1; // 2's comp
}
Tc_100 = (TReading*100/2);
Whole = Tc_100/ 100; // separate off the whole and fractional portions
Fract = Tc_100 % 100;
sprintf(msg, "Temp %c%d.%d\ C",SignBit ? '-' : '+', Whole , Fract < 10 ? 0 : Fract/10);
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx(); // Wait for message to finish
delay(500);
digitalWrite(led, LOW);
delay(500);
digitalWrite(sen, LOW);
digitalWrite(sender, LOW);
pinMode(sen, INPUT);
pinMode(led, INPUT);
pinMode(sender, INPUT);
}
// 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
// 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
void setup_watchdog(int ii) {
byte bb;
int ww;
if (ii > 9 ) ii=9;
bb=ii & 7;
if (ii > 7) bb|= (1<<5);
bb|= (1<<WDCE);
ww=bb;
MCUSR &= ~(1<<WDRF);
// start timed sequence
WDTCR |= (1<<WDCE) | (1<<WDE);
// set new watchdog timeout value
WDTCR = bb;
WDTCR |= _BV(WDIE);
//sei(); // Enable global interrupts
}
// Watchdog Interrupt Service / wird ausgeführt, wenn Watchdog abgelaufen ist
ISR(WDT_vect) {
f_wdt=1; // set global flag
}
werden Immer 127 gesendet......
#include <VirtualWire.h>
#include <OneWire.h>
int HighByte, LowByte, TReading, SignBit, Tc_100, Fract , Whole;
char msg[20];
float temp;
int led = PB0;//PB0
int sen = PB1;//++ Sensor
int sender = PB2;//++ sender
OneWire ds(3); // 1-wire bus D4
byte addr3[8]={0x10, 0xD5, 0x3A, 0x0E, 0x03, 0x08, 0x00, 0x6A}; //sensor
void setup(void) {
vw_set_ptt_inverted(true); // Required for RF Link module
vw_setup(2000); // Bits per sec
vw_set_tx_pin(4); // pin x 433 empfänger
pinMode(led, OUTPUT);
pinMode(sender, OUTPUT);
pinMode(sen, OUTPUT);
digitalWrite(sen, HIGH);
digitalWrite(sender, HIGH);
delay(200);
}
void loop(void) {
digitalWrite(led, HIGH);
byte i;
byte present = 0;
byte data[12];
ds.reset();
ds.select(addr3);
ds.write(0x44,0); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
//ds.depower();
present = ds.reset();
ds.select(addr3);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++)
{ // we need 9 bytes
data[1] = ds.read();
}
LowByte = data[0];
HighByte = data[1];
TReading = (HighByte << 8)+ LowByte;
SignBit = TReading & 0x8000; // test most sig bit
if (SignBit) // negative
{
TReading = (TReading ^ 0xffff) + 1; // 2's comp
}
Tc_100 = (TReading*100/2);
Whole = Tc_100/ 100; // separate off the whole and fractional portions
Fract = Tc_100 % 100;
sprintf(msg, "Temp %c%d.%d\ C",SignBit ? '-' : '+', Whole , Fract < 10 ? 0 : Fract/10);
vw_send((uint8_t *)msg, strlen(msg));
vw_wait_tx(); // Wait for message to finish
delay(500);
digitalWrite(led, LOW);
delay(500);
}
Läuft perfekt....nur ohne stromsparen