Nokia LCD + attiny85+433Mhz als emfänger mit Virtualwire

Hallo Jungs, hab mal wieder eine Frage.. kann ich den ATTINY85 mit Virtualwire als Empfänger benutzen geht das überhaupt, als Sender(Temperatur) klappt alles bei mir ,Attiny85+NokiaLCD+433Mhz Receiver. Hab den Sketch von Uno genommen aber leider empfängt das Ding nichts, habe auch keine Beispiele im netz gefunden.. Dacht das es nicht geht..

parabello:
Hallo Jungs, hab mal wieder eine Frage.. kann ich den ATTINY85 mit Virtualwire als Empfänger benutzen geht das überhaupt, als Sender(Temperatur) klappt alles bei mir ,Attiny85+NokiaLCD+433Mhz Receiver. Hab den Sketch von Uno genommen aber leider empfängt das Ding nichts, habe auch keine Beispiele im netz gefunden.. Dacht das es nicht geht..

Also empfangen funktioniert. Habe ich schon aufgebaut. Ob dann noch ein Display dran funktioniert, kann ich nicht sagen.
Da heißt es dann testen.
Kannst du denn am ATtiny85 auch debuggen ? Also mit dem seriellen Monitor ansehen.
Dann könnte man das besser testen.

HotSystems:
Also empfangen funktioniert. Habe ich schon aufgebaut. Ob dann noch ein Display dran funktioniert, kann ich nicht sagen.
Da heißt es dann testen.
Kannst du denn am ATtiny85 auch debuggen ? Also mit dem seriellen Monitor ansehen.
Dann könnte man das besser testen.

Hi HotSystems, Hab da eben was gefunden, aber alles Englisch, dauert ein bisschen. das Display läuft ja am Attiny super, da brauche ich nichts debuggen. Oder hat es gewisse Vorteile?? kannst du mal dein Sketch posten???

parabello:
....das Display läuft ja am Attiny super, da brauche ich nichts debuggen. Oder hat es gewisse Vorteile?? kannst du mal dein Sketch posten???

Ja, ich meinte auch beides zusammen.
Aber wenn es schon funktioniert, ok.

Ja, ich muss den Sketch raus suchen, bin jetzt nicht mehr am PC.

Nee Läuft nicht..........wen du mal Zeit hast würde ich mich freuen....

Ohhh…
Sorry, da habe ich mich verguckt. Mein Sketch funktioniert mit der RCSwitch und dem ATtiny85, nicht mit dem VirtualWire.
Ich werde das aber mal mit VirtualWire testen. Muss nur die Zeit dazu haben. :wink:

Mein Sketch funktioniert mit der RCSwitch und dem ATtiny85,

und das als Empfänger? Das würde mich Interessieren.

ardubu:
und das als Empfänger? Das würde mich Interessieren.

Ja, als Empfänger. Kann ich später posten.

HotSystems:
Ohhh....
Sorry, da habe ich mich verguckt. Mein Sketch funktioniert mit der RCSwitch und dem ATtiny85, nicht mit dem VirtualWire.
Ich werde das aber mal mit VirtualWire testen. Muss nur die Zeit dazu haben. :wink:

Schade,RCSwitch hatte ich auch am laufen,aber meine sender laufen zur zeit mit Virtualwire,da finde ich nichts passendes und was ich gefunden habe läuft nicht....

parabello:
Schade,RCSwitch hatte ich auch am laufen,aber meine sender laufen zur zeit mit Virtualwire,da finde ich nichts passendes und was ich gefunden habe läuft nicht…

Ich werde das kurzfristig mit der VirtualWire testen.

Hier noch der Sketch für ardubu.

/*
 * Testsketch RCSwitch - ATtiny85 - 433 MHz-Empfänger
 *
 *
  Belegung des Attiny:
    1 (SS)PB5  |  \/  |  Vcc         8
    2     PB3  |      |  PB2 (SCK)   7
    3     PB4  |      |  PB1 (MISO)  6
    4     GND  |      |  PB0 (MOSI)  5
 *
*/

#include <RCSwitch.h>                     // https://github.com/sui77/rc-switch/
RCSwitch mySwitch = RCSwitch();

// Receiver-Daten       = 2;              // Daten-Eingang vom Empfänger            PB2, Pin #7
unsigned long RecData   = 0;              // Empfänger-Daten

// Funkcode der einzelnen Funktionen
const long rcCode1 = 5264835;
const long rcCode2 = 5264844;
const long rcCode3 = 5264873;

void setup() {
  mySwitch.enableReceive(0);              // Receiver on interrupt 0 => that is PB2, Pin #7
}


void loop()
{
  if (mySwitch.available()) {
    RecData = mySwitch.getReceivedValue();
    switch (RecData) {
      case rcCode1:
        // Funktion 1
        break;
      
      case rcCode2:
        // Funktion 2
        break;
      
      case rcCode3:
        // Funktion 3
        break;
    }
  }
  mySwitch.resetAvailable();
}

Folgende Zeile in der Library “RCSwitch.h” muss angepasst (auskommentiert) werden:

//#define RCSwitchDisableReceiving

Wurde hier auch schon diskutiert.

HotSystems:
Ich werde das kurzfristig mit der VirtualWire testen.

Bin gespannt....... das Problem bei RCSwitch ist ja negative temperatur zu senden...

parabello:
Bin gespannt....... das Problem bei RCSwitch ist ja negative temperatur zu senden...

Ja, das würde auch gehen.

Mit ein wenig Rechenwerk...

HotSystems:
Ja, das würde auch gehen.

Mit ein wenig Rechenwerk...

japs....

So habe es geschafft, :slight_smile: muss ehrlich zugeben hatte alles ausprobiert RCSwitch,Virtualwire,und anderes kein Erfolg. Da wurde ich sehr stutzig und ging nochmal die Zusammengelötete Platine durch(mit Lupe) und sehe hatte kein Kontakt mit dem Empfänger ,kalte Lötstelle. Und hier der Sketch vom empfangen… Sender werde ich noch Posten …fiel Spaß beim experimentieren…

// Nokia 5110 LCD + Attiny85-> Empfang 1x DHT21Temperatur+RFeuchtigkeit%
// und 1x einen DS18B20 Temperatur  
// Binary sketch size: 8088 Bytes (of a 8,192 byte maximum) also 99%
// Anschlüsse 
// 433 MHZ Empfänger an Pin PB2 

// Display  NOKIA 5110
// LCD Clk   >  PB0         LCD Din   > PB1
// LCD DC    >  PB4         LCD CE    > GND
// LCD RST   >  PB3

#include <VirtualWire.h>
#include <LCD5110_Basic.h> //extra für attiny zugeschnitten
//____Variablen global
char buf[20];
String ort;
char* zeichendht;
String zeichenstringdht;
char* zeichends;
String zeichenstringds;
//__________________________________________

LCD5110 myGLCD(0,1,4,3,6); //D6 don't exist!!! conected to GND!

//extern uint8_t MediumNumbers[]; //font that we use
extern uint8_t SmallFont[];
//extern uint8_t BigNumbers[];


void setup(void) {
       
    myGLCD.InitLCD(); // (xx)contrast value 70 default
    myGLCD.setContrast(60);
  // myGLCD.setFont(BigNumbers);
    myGLCD.setFont(SmallFont);
    myGLCD.print("***BEREIT***",CENTER, 0);
    vw_set_rx_pin(2);// BP2 am Attiny85-> Empfänger 
    vw_setup(2000); // 2000 Bits per sec
    vw_rx_start();
  }

void loop() {
empfang();
}//ende loop


void empfang()
{
  int kommadht=0;
  int hydrdht=0;
  int tempdht=0;
  int kommads=0;
  int tempds=0;
   int x=0;
   int i;
   uint8_t buf[VW_MAX_MESSAGE_LEN];
   uint8_t buflen = VW_MAX_MESSAGE_LEN;
   char Datenempfang[VW_MAX_MESSAGE_LEN+1];
  if (vw_get_message(buf, & buflen)) // check to see if anything has been received 
    {
      memset(Datenempfang, 0, VW_MAX_MESSAGE_LEN+1); // Das ganze Array mit 0 füllen
      for (i = 0; i < buflen; i++) {
      Datenempfang[i] = (char)buf[i];
    }
     Datenempfang[VW_MAX_MESSAGE_LEN+1] = '\0';
     myGLCD.print(" Empfangen!!!    ",CENTER, 0);
    // myGLCD.print(Datenempfang,0,20); // zeigt an was Empfangen wurde..(Rohdaten)
    // Ersten Inhalt (xxxx) vor dem : holen , in dem der Ort bzw Name des Sensors steht
       ort = strtok(Datenempfang, " : "); 
      if (ort=="DHT"){  
        zeichendht = (strtok(NULL, " : "));   
       tempdht = atoi(strtok(NULL, " : "));   //string in int Variable umwandeln
       hydrdht = atoi(strtok(NULL, "   "));   //string in int Variable umwandeln
         x=0;
        zeichenstringdht=zeichendht;  //Char in Stringzeichen umwandeln "+" oder "-" 
        if (zeichenstringdht == "+" ) {
          myGLCD.print("Temp:+",x,25);
          myGLCD.printNumF((float(tempdht))/10 ,1,x+37,25);
          }
      
        if (zeichenstringdht == "-" ) {
          myGLCD.print("Temp:-",x,25); 
          myGLCD.printNumF((float(tempdht))/10 ,1,x+37,25);
          }
       x=0;
       myGLCD.print("Feuchte:",x,35);
       myGLCD.printNumF((float(hydrdht))/10 ,1,x+47,35);
         myGLCD.print("%",x+75,35);
      };//if DHT 
      // bei mir heist der DS18B20 "Drausen" kann ein beliebiger nahmen sein,hauptsache stimmt mit dem SENDER überein!!!
      if (ort=="Drausen"){  
           zeichends = (strtok(NULL, " :  "));   
           tempds  =  atoi(strtok(NULL, "  "));//string in int Variable umwandeln
           zeichenstringds=zeichends;           
           if (zeichenstringds == "+" ) {
           myGLCD.print("Drausen:+",x,45);
           myGLCD.printNumF((float(tempds))/10 ,2,x+55,45);
           }
          if (zeichenstringds == "-" ) {
          myGLCD.print("Drausen:-",x,45);
          myGLCD.printNumF((float(tempds))/10 ,2,x+55,45);//integer als Float umwandeln und darstellen.
        }
     }//ende if drausen
     }
}//ende empfang

Es nimmt 99% ein, gibt kein Spielraum mehr… falls fragen gibt einfach fragen…

Na prima.
Toll, das es dann doch noch funktioniert hat.
Danke für die Rückmeldung und dem Sketch.

hier das versprochene Sendeprogramm-> Attiny85 mit einem DHT22 mittels Virtualwire.

/// ATTINY25/45/85 pinout for ARDUINO + DHT22
//
//                  +-\/-+
// Ain0 (D 5) PB5  1|    |8  Vcc
// Ain3 (D 3) PB3  2|    |7  PB2 (D 2) Ain1
// Ain2 (D 4) PB4  3|    |6  PB1 (D 1) pwm1
//               GND  4|    |5  PB0 (D 0) pwm0
//                       +----+



#include <VirtualWire.h>
#include <Small_dht.h>

 dht DHT;
#define DHT22_PIN 3  // PB3 pin  wo der DHT22 angeschlossen ist   
 
 volatile boolean f_wdt = 1;
                 
 char msg[20];

  
void setup(){
    vw_set_ptt_inverted(true); // Required for RF Link module
    vw_setup(2000); // Bits per sec
    vw_set_tx_pin(4); // pin PB4  433 Sender 

  }

void loop() {
       abfrage_dht();
       delay(1000);
    }//ende LOOP 



void abfrage_dht()
{  
   int chk=0;
   int temp=0;
   int hydr=0; 
     chk = (DHT.read22(DHT22_PIN));        // read sensor
     temp=(DHT.temperature*10);    // transmit temperature
     hydr=(DHT.humidity*10);        // transmit humidity
    sprintf(msg, "DHT:+:%d:%d",temp,hydr);//"DHT:+:%d:%d",temp,hydr
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx();    // Wait for message to finish
   
}

Senden DS18S20 oder DS18B20 mus angepasst werden… unverändert läuft mit einem DS18B20 10bit auflösung

// ATtiny85 + DS18S20 bzw DS18B20 8Mhz Internal 
// muss an den jeweiligen Sensoren angepasst werden


#include <VirtualWire.h>
#include <OneWire.h>

int HighByte, LowByte, TReading, SignBit, Tc_100, Fract , Whole;

 char msg[20];
volatile boolean f_wdt = 1;
float temp;

OneWire  ds(3);  // 1-wire bus D4


byte addr[8]={0x28, 0xD6, 0x10, 0x78, 0x05, 0x00, 0x00, 0x95}; //sensor lose DS18B20 Bitte anpassen!!



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   
    delay(2000);  
   }

void loop(void) 
    {
      abfrage();
      delay(100000); //ist bei mir ca. 1 Sekunde
       
   }//ende loop


void abfrage() {

do{
  byte i1;
  byte present1 = 0;
  byte data1[12];
 
// die 10 Bit auflösung BITTE den Teil bei einem DS18S20 Ausklammern
//****************DS18B20********************
    ds.reset();             // rest 1-Wire
    ds.select(addr);        // select DS18B20
    ds.write(0x4E);         // write on scratchPad
    ds.write(0x00);         // User byte 0 - Unused
    ds.write(0x00);         // User byte 1 - Unused
    ds.write(0x5F); // set up en (12 bit (0x7F)) 0x1F // ( 9 bit  3F) // (10 bit 5F) // (11 bit  0x7F) 
//*******************************************    
  
    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(); 
    present1 = ds.reset();
    ds.select(addr);    
    ds.write(0xBE);         // Read Scratchpad

    for ( i1 = 0; i1 < 9; i1++) 
    {           // we need 9 bytes
      data1[i1] = ds.read();
    }

    LowByte = data1[0];
    HighByte = data1[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);  //für DS18S20 aus oder einklammern
    Tc_100 = ( 6 * TReading) + TReading / 4;  //für DS18B20  aus oder einklammern
     Whole = Tc_100/ 100;  // separate off the whole and fractional portions
     Fract = Tc_100 % 100;
  } while (Whole==85); 
  
     //sprintf(msg, "Drausen: %c:%d%d ",SignBit ? '-' : '+', Whole , Fract < 10 ? 0 : Fract/10);//DS18S20
     sprintf(msg, "Drausen: %c:%d%d\ C",SignBit ? '-' : '+', Whole , Fract < 10 ? 0 : Fract/10);//DS18B20
   vw_send((uint8_t *)msg, strlen(msg));
   vw_wait_tx();    // Wait for message to finish
     
   }//ende abfrage