Attiny85 433Mhz Empfänger Sketch nicht ganz klar

Hi,

habe mir erfolgreich n Attiny Programmer mit nem Nano gebaut, mit dem man über die IDE das Programm brennt, vorerst tut dieser nur Attiny85 programmieren. Bin ich Stolz drauf, wollte schon als "kleiner Junge" immer die Chips Programmieren. :wink:
Habe dann mal zum Spaß folgendes Beispiel abgearbeitet:

Das hat funktioniert, allerdings ist mir aufgefallen das die Reichweite deutlich geringer ist als wenn man das über zwei Arduinos laufen lässt. Also nicht wie normal bei mir von Mega zu Nano. Aber das soll erstmal nicht so wichtig sein!

Frage fürs Verständnis:

 if (buf[0]== '1' && buf[1]== '1')

bedeutet doch:
wenn der empfangende Code korrekt durch das abgleichen ist, wird die LED geschaltet?
Wofür steht bei "buf[0]" die 0 bzw die 1 in der rechteckigen Klammer? Die 1 im Apostroph würde mich auch brennend interessieren! :wink:

Wie müsste man das anstellen wenn man z.B. mit ner 433Mhz Fernbedienung den Befehl aktivieren möchte?
Die Adressen der Kanäle hab ich schon ausgelesen und in Excel reingepackt.

Möglicherweise ist das sehr einfach zu lösen, aber ich stehe noch recht am Anfang. Meiner Meinung nach schon Fortschritte gemacht.

Beste Grüße!

Wenn du einen ATtiny85 statt eines Uno/Mega verwendest, hat das erstmal nix mit der Reichweite zu tun. Da hast du einen anderen Fehler gemacht. Für die "Funkreichweite" ist der Sender und der Empfänger zuständig. Sowie die Art der Montage und der Antennen. Auch die Betriebsspannung spielt da eine Rolle. Aber auch der verwendete Sketch kann da mit reinspielen.

Zur Frage:
"buf[1]" ist hier ein Array und die Zahl gibt die Stelle im Array an. Die '1' ist der Wert auf der geprüft wird.

Das müsstest du besser erklären.
Und welche Kanäle ?

Dein Hauptproblem liegt vermutlich am Empfänger, da dieser sehr schlecht ist.

Danke dir für die Rückmeldung!
Bezüglich der Reichweite habe ich die Kabel Steckverbinder im verdacht, die Qualität ist nicht so dolle. Ein anderer Fehler ist natürlich auch möglich.

Aaahh, so ist das zu verstehen!

Was ich mit dem Auslesen meine: Ich habe die Codes aller Tasten ausgelesen in dem ich mit dem Mega das Signal aufgefangen und den Code aus dem seriellem Monitor in ein Excel Dokument, zur besseren Übersicht, kopiert.

Im Umkehrschluss bedeutet das doch folgendes, man kann doch nun die ausgelesenen Codes in die Klammern setzen, und wenn dieser Empfangen wird, wird z.B. ein Pin auf High geschaltet, oder?

Beste Grüße!

Möglich, aber auch selten der Fall. Hast du eine Antenne am Sender und Empfänger ?

In welche Klammern meinst du ?

Ja es ist an beiden die Antenne angelötet.
Öhhm, im Apostroph meine ich, Ups! :sweat_smile:

Dazu müsstest du mal deinen kompletten Sketch posten.
Ich schätze, das passt nicht, da hier nur ein Zeichen abgefragt wird.

Das ist der Empfänger:

#include <VirtualWire.h>

#define rxPin 3
#define ledPin 4

void setup(){

  pinMode(ledPin, OUTPUT); 

  vw_set_ptt_inverted(true);
  vw_set_rx_pin(rxPin);
  vw_setup(100); // Bits per sec
  vw_rx_start();
}

void loop(){
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;

  if (vw_get_message(buf, &buflen)) // Non-blocking
  {

    if (buf[0]== '1' && buf[1]== '1')
    {
      digitalWrite(ledPin, HIGH);
    }  
    else
    {
      digitalWrite(ledPin, LOW);
    }  
  }
}

Ach, du machst es mit VirtualWire, das ist falsch.
Die ist zum Übertragen von Daten gedacht, nicht zum Schalten.

Such mal nach RCSwitch-Library. Damit kannst du Fernbedienungen direkt auswerten und auch nachbilden.

Genau damit und dem Mega hab ich die Fernbedienung ausgewertet!
Allerdings kann ich das nicht auf den Attiny85 brennen da kommt folgende Meldung; 'Serial' was not declared in this scope
Hab da schon nach ner Lösung Ausschau gehalten, bin aber nicht fündig geworden die Bibliothek so zu nutzen.

Habe diesen Beispiel Code genommen:

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() 
{
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // Empfänger ist an Interrupt-Pin "0" - Das ist am UNO der Pin2
}

void loop() {
  if (mySwitch.available()) // Wenn ein Code Empfangen wird...
  {
    int value = mySwitch.getReceivedValue(); // Empfangene Daten werden unter der Variable "value" gespeichert.
  
    if (value == 0) // Wenn die Empfangenen Daten "0" sind, wird "Unbekannter Code" angezeigt.
    {
    Serial.println("Unbekannter Code");
    } 
    
    else // Wenn der Empfangene Code brauchbar ist, wird er hier an den Serial Monitor gesendet.
    {
    Serial.print("Empfangen: ");
    Serial.println( mySwitch.getReceivedValue() );
    }

    mySwitch.resetAvailable(); // Hier wird der Empfänger "resettet"
  }

}

Für RCSwitch brauchst du kein "Serial", das ist nur zum debuggen. Das kannst du rausnehmen.
Mach den Sketch erst komplett auf dem Arduino lauffähig.
Wenn ich später am PC bin, schau ich mal, ob ich für den ATTiny85 noch was habe.
Ich habe da früher schon eine Auswertung geschrieben.
Da muss auch die Library geändert werden. Das schreibe ich dazu.

Hier mal mein testsketch ATTiny85 mit 433MHz Empfänger für RCSwitch:

/*
 * 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();
}

Und in der RCswitch.h musst du folgende Zeile auskommentieren:

// At least for the ATTiny X4/X5, receiving has to be disabled due to
// missing libm depencies (udivmodhi4)
#if defined( __AVR_ATtinyX5__ ) or defined ( __AVR_ATtinyX4__ )
//#define RCSwitchDisableReceiving  <<<< Diese auskommentieren !
#endif

natürlich musst du deine Codes verwenden.

Vielen Dank!
Werd mir das mal zu Gemüte führen und mich melden sobald ich was auf die beine gestellt habe.

Unbedingt....sollte es nicht funktionieren, machst du noch etwas falsch.
Aber da schaun wir dann.

Also ich hab den Code doch noch geschrieben, beim Kompilieren gab es keine Fehler.
Brennen tu ich den Morgen, das wird heute eh schon später als gedacht! :sweat_smile:

/*
 * 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/
#define Ch1 3
#define Ch2 4
#define Ch3 1
#define Ch4 0
#define txPin 2
const int t= 250; //Dauer in ms wie lange der Ausgang auf An steht

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 = 14537987;  //Kanal 1 Pin2
const long rcCode2 = 14537996;  //Kanal 2 Pin3
const long rcCode3 = 14538032;  //Kanal 3 Pin5
const long rcCode4 = 14538188;  //Kanal 4 Pin6


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:
        if (RecData == 14537987);
        {
          digitalWrite(Ch1, HIGH);
          delay (t);
          digitalWrite(Ch1, LOW);
        }      
        break;
      
      case rcCode2:
      if (RecData == 14537996);
      {
        digitalWrite(Ch2, HIGH);
        delay (t);
        digitalWrite(Ch2, LOW);
      }      
        break;
      
      case rcCode3:
        if (RecData == 14538032);
        {
          digitalWrite(Ch3, HIGH);
          delay(t);
          digitalWrite(Ch3, LOW);
        }
        break;

      case rcCode4:
        if (RecData == 14538188);
        {
          digitalWrite(Ch4, HIGH);
          delay(t);
          digitalWrite(Ch4, LOW);
        }
        break;
    
    }
  }
  mySwitch.resetAvailable();
}

Was du da machst ist "doppelt gemoppelt".
In der Switch-Case brauchst du nicht noch eine if-Abfrage, wenn diese die selben Werte enthält.
Die Switch-Case reicht da völlig.
Und das "#define txPin 2" darfst du weglassen, der Datenpin ist hier
mySwitch.enableReceive(0);
mit "0" belegt, das ist der physische Pin7.

Also das Programm Funktioniert!! :grinning:
Der Attiny schaltet zwar es kommen aber nur 2,5V am Pin an(4,8V liegen am VCC Pin an), hatte mich schon gewundert warum die Led nur so leicht glimmt. Wie kommt das?

kein pinmode output

Prima....das freut mich.
Noiasca hat dir ja schon geschrieben, wo dein Problem liegt.
pinMode(Ch1, OUTPUT);
Für alle Led-Ausgänge mit der richtigen Nummer.

@HotSystems Wie ich mich erst freue! :grinning:
@noiasca Oh ja stimmt, das hätte man wirklich wissen müssen... naja danke trotzdem!
Ein Neues Problem ist aufgetaucht, der Attiny funktioniert nur mit der USB-Spannungsversorgung vom PC aus. Mit ner 18650 passiert nichts, obwohl die Spannung (4V) anliegt.