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. ![]()
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.
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,
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