Negative Temp Senden RCswitch (433Mhz) ATTINY85 -> empfang Arduino Nano

Abend Leute,
wer kann mir da ein Tipp geben und zwar sende ich mit einem ATTINY85 und DS18B20 mittels einem 433 Mhz Transmitter die Temperatur zu einem Arduino Nana, läuft alles gut im + Bereich, sobald - Temp kommt kommen komische zahlen an. Bibliotheken RCSwitch. wie kann ich eine negative Temperatur versenden???? Google hat mich auch nicht aufklären können.
Danke im Voraus.

parabello:
Abend Leute,
wer kann mir da ein Tipp geben und zwar sende ich mit einem ATTINY85 und DS18B20 mittels einem 433 Mhz Transmitter die Temperatur zu einem Arduino Nana, läuft alles gut im + Bereich, sobald - Temp kommt kommen komische zahlen an. Bibliotheken RCSwitch. wie kann ich eine negative Temperatur versenden???? Google hat mich auch nicht aufklären können.
Danke im Voraus.

Um eine Temperatur zu übertragen ist die RCSwitch völlig falsch.

Nimm die VirtualWire dafur, dann funktioniert das auch.
Und du hat doch auch schon damit gearbeitet.

HotSystems:
Um eine Temperatur zu übertragen ist die RCSwitch völlig falsch.

Nimm die VirtualWire dafur, dann funktioniert das auch.
Und du hat doch auch schon damit gearbeitet.

Danke HotSystems, ja habe ich, ich fand RCswitch einfach, da mein Englisch bei null ist, habe versucht da was rauszufinden ob es auch wie mit VirVirtualWire geht, hatte ich mir schon gedacht, werde wohl dan alles ändern müssen..... Welche forteile hat den RCswitch, wann ist es besser zu benutzen???

RCSwitch ist, wie der Name auch andeutet, zum Schalten gedacht.
Also, wenn du Funksteckdosen o.ä. schalten möchtest, dafür ist RCSwitch sehr gut geeignet.

Aber für die Messdaten eignet sich VirtualWire ssehr viel besser, da damit auch negative Werte übertragen werden.

RCSwitch ist durchaus in der Lage 32 Bit zu übertragen,
wie man die interpretiert (signed/unsigned) ist doch völlig egal.

Perfekt, läuft Danke. Hier der Sketch, nur fernstehe ich nicht warum es 3x 85.00 °C angezeigt b.z.w. übertragen wird bevor die richtige Temp übertragen wird :frowning:

// ATtiny85 + DS18B20 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 sen = PB1;//++ Sensor
int sender = PB2;//++ sender

  char msg[6];
  int Temp1; 

volatile boolean f_wdt = 1;


OneWire  ds(3);  // 1-wire bus 
//  28 BB 35 78 5 0 0 36  DS18B20 Familie.
byte addr1[8]={0x28, 0xBB, 0x35, 0x78, 0x05, 0x00, 0x00, 0x36}; //loose sensor #1

int temp;


void setup(void) {
  
  //pinMode(led, OUTPUT);  
    pinMode(sender, OUTPUT);   
    pinMode(sen, OUTPUT);    
     setup_watchdog(9); // approximately 8 seconds sleep
     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
}

void loop(void) {
  
  if ( f_wdt==1) {  // wait for timed out watchdog / flag is set when a watchdog timeout occurs
    f_wdt=0;       // reset flag
  digitalWrite(sen, HIGH); 
  digitalWrite(sender, HIGH);
  delay(50);
  abfrage();
   dtostrf(temp, 6, 2, msg);
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx();                                         // Wait for message to finish
 delay(2000);

 
  delay(50);
  digitalWrite(sen, LOW); 
  digitalWrite(sender, LOW);
     pinMode(sen, INPUT); 
     pinMode(sender, INPUT);
     for (int myLoop= 0; myLoop < 2; myLoop++) { // loop around and give delay of 2 * 9sec = 18 sec
     system_sleep();
     }
   pinMode(sen, OUTPUT); 
   pinMode(sender, OUTPUT);
  }

}//ende loop




// set system into the sleep state
// system wakes up when wtchdog is timed out
void system_sleep() {
 
  cbi(ADCSRA,ADEN);                    // switch Analog to Digitalconverter OFF
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
  sleep_enable();
  sleep_mode();                        // System sleeps here
  sleep_disable();                     // System continues execution here when watchdog timed out
  sbi(ADCSRA,ADEN);                    // switch Analog to Digitalconverter ON

}
// 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);
}
 
// Watchdog Interrupt Service / is executed when watchdog timed out
ISR(WDT_vect) {
  f_wdt=1;  // set global flag
}

void abfrage()
{
  byte i;
  byte present = 0;
  byte data[12];

  ds.reset();
  ds.select(addr1); // sensor #1
  ds.write(0x44,0); //start conversion, NO parasite power ds.write(0x44,0); 
  delay(750);  //  nicht parasitören modus delay(750);
  //ds.depower();
 present = ds.reset();
  ds.select(addr1);   
  ds.write(0xBE);         // Read Scratchpad
  for ( i = 0; i < 9; i++){
       data[i] = ds.read();
  }
  // convert the data to actual temperature
 temp =( (data[1] << 8) + data[0] )*0.0625;
  
}

Whandall:
RCSwitch ist durchaus in der Lage 32 Bit zu übertragen,
wie man die interpretiert (signed/unsigned) ist doch völlig egal.

Ok, da ist sicher per Definition eine Anpassung möglich.
Ich sehe den Aufwand aber höher als es mit der VirtualWire ist.
Allerdings lassen sich nach meiner Erfahrung negative Werte mit der RCSwitch nicht direkt übertragen, zumindest habe ich darüber auch nichts gelesen.

parabello:
Perfekt, läuft Danke. Hier der Sketch, nur fernstehe ich nicht warum es 3x 85.00 °C angezeigt b.z.w. übertragen wird bevor die richtige Temp übertragen wird :frowning:

Ich vermute mal, dein Sensor ist noch nicht bereit, richtige Messwerte zu liefern.
Dem solltest du ein wenig Zeit geben, die Messwerte zur Verfügung zu stellen.

Ich mache es beispielsweise so, dass ich die Daten des Sensors alle 30 Sek. auslese und versende.
Allerdings steht der Ssensor bei mir immer unter Spannung, was bei dir vermutlich nicht der Fall ist.

HotSystems:
Ich vermute mal, dein Sensor ist noch nicht bereit, richtige Messwerte zu liefern.
Dem solltest du ein wenig Zeit geben, die Messwerte zur Verfügung zu stellen.

Ich mache es beispielsweise so, dass ich die Daten des Sensors alle 30 Sek. auslese und versende.
Allerdings steht der Ssensor bei mir immer unter Spannung, was bei dir vermutlich nicht der Fall ist.

ja das ist so, der wird nur mit Strom versorgt bevor gemessen wird und abgeschaltet, bevor der Attiny schlafen geht. werde es mal versuchen bevor das 1 mal abgefragt wird mehr Zeit geben..

parabello:
ja das ist so, der wird nur mit Strom versorgt bevor gemessen wird und abgeschaltet, bevor der Attiny schlafen geht. werde es mal versuchen bevor das 1 mal abgefragt wird mehr Zeit geben..

Ja, das sollte helfen.
Irgendwo im Datenblatt steht auch, wieviel Zeit der Sensor braucht.
Bedingt durch den OneWire dauert es etwas. Und wenn du die Betriebsspannung nicht zusätzlich (parasit-Modus) an den Sensor ranführst, sogar noch etwas länger.