ich möchte mit einem Digispark Attiny85 via 433Mhz Modul die Lautstärke an meinem PC steuern können. Dazu habe ich ein 433Mhz Empfänger-Modul an 5V, GND und Pin2 des Attiny85 angeschlossen. Um die Lautstärke via HID des ATtiny85 ändern zu können habe ich die Bibiliothek TrinketHidCombo.h verwendet. Diese Bibliothek unterstützt auch Multimedia-Tasten. Getestet hatte ich esrtmal ohne 433Mz Modul mit einem einfachen Button. Das hat super funktioniert.
Das Problem kommt jetzt allerdings mit dem 433Mhz Modul. Ich benutze die Bibliothek RCswitch. Diese scheint wohl nicht gut mit dem Attiny85 klar zu kommen. In einem anderen Post hatte ich gelesen, dass man folgende Zeile in der RCswitch.h auskommentieren soll:
#define RCSwitchDisableReceiving
Das habe ich gemacht, leider ohne Erfolg. Ich bekomme immer folgende Fehlermeldung:
In function 'void setup()':
Steffi_Volume_Control:17:18: error: 'enableReceive' was not declared in this scope
enableReceive(0);
^
exit status 1
'enableReceive' was not declared in this scope
Zum Nachvollziehen hier mein Sketch:
#include "TrinketHidCombo.h"
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
void setup()
{
TrinketHidCombo.begin(); // start the USB device engine and enumerate
pinMode(BUTTON, INPUT);
Serial.begin(9600);
mySwitch.enableReceive(0); // Empfänger ist an Interrupt-Pin "0" - Das ist am UNO der Pin2
enableReceive(0);
}
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() );
if (value == 5526613)
{
TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_UP);
delay(100);
}
}
mySwitch.resetAvailable(); // Hier wird der Empfänger "resettet"
}
}
Wenn mir jemand bei diesem Problem weiterhelfen kann oder sogar eine Lösung parat hat wäre ich wahnsinnig dankbar.
Erst einmal vielen vielen Dank für die Hilfe. Der Fehler war tatsächlich die Codezeile:
enableReceive(0);
Warum ich die drin hatte weiß ich gar nicht mehr. Aber ja, das ergibt keinen Sinn und ohne diese Zeile hat alles einwandfrei funktioniert.
Nun habe ich aber ein Problem mit der TrinketHidCombo Bibliothek, mit welcher ich den Tastaturbefehl für Volume Up/Down via HID des Attiny85 an den PC senden möchte. Wenn diese Bibliothek eingebunden wird, klappt zwar der Upload, allerdings erscheint die Meldung am PC, dass ein USB-Gerät nicht erkannt worden konnte.
Gibt es noch eine andere Möglichkeit einen Tasturbefehl für Volume Up/Down zu senden? Oder kennt jemand eine Lösung, dass der Attiny trotz dieser Bibliothek erkannt werden kann?
Mein Code sieht mittlerweile wie folgt aus:
#include "TrinketHidCombo.h"
#include <RCSwitch.h>
//#include "DigiKeyboard.h"
RCSwitch mySwitch = RCSwitch();
void setup()
{
TrinketHidCombo.begin(); // start the USB device engine and enumerate
mySwitch.enableReceive(0); // Empfänger ist an Interrupt-Pin "0" - Das ist am UNO der Pin2
}
void loop()
{
//DigiKeyboard.sendKeyStroke(0);
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.
{
//DigiKeyboard.println("unbekannter code");
}
else // Wenn der Empfangene Code brauchbar ist, wird er hier an den Serial Monitor gesendet.
{
if (value == 21589)
{
TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_UP);
delay(100);
}
}
mySwitch.resetAvailable(); // Hier wird der Empfänger "resettet"
}
}
Für Ratschläge, Lösungen oder Ansätze wäre ich wahnsinnig dankbar!!!
Ich habe die Treiber installiert, allerdings lösen diese nicht das Problem. Mit der TrinketHidCombo Bibliothek und RCSwitch kommt wieder die Meldung, dass das USB Gerät nicht erkannt werden kann. Der Upload des Sketch funktioniert aber reibungslos.
Ich bin noch auf etwas anderes aufmerksam geworden. Im PDF der DigiKeyboard Bibliothek gibt es einen Wert für Volume Up. Diesen habe ich wie folgt in den Code eingefügt, aber leider ohne Erfolg:
DigiKeyboard.sendKeyStroke(128);
Das PDF zu DigiKeyboard gibt es hier:
Auf Seite 56 ist der Eintrag zu Volume Up/Down zu finden. Hat jemand damit Erfahrung und kann mir helfen das richtig in den Code einzubinden. Damit würde mein Code bisher wie folgt aussehen:
#include <RCSwitch.h>
#include "DigiKeyboard.h"
RCSwitch mySwitch = RCSwitch();
void setup()
{
mySwitch.enableReceive(0); // Empfänger ist an Interrupt-Pin "0" - Das ist am UNO der Pin2
}
void loop()
{
DigiKeyboard.sendKeyStroke(0);
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.
{
//DigiKeyboard.println("unbekannter code");
}
else // Wenn der Empfangene Code brauchbar ist, wird er hier an den Serial Monitor gesendet.
{
if (value == 21589)
{
DigiKeyboard.sendKeyStroke(128);
}
}
DigiKeyboard.delay(100);
mySwitch.resetAvailable(); // Hier wird der Empfänger "resettet"
}
}
Nach langem Online-Stöbern habe ich letztendlich eine Lösung für mein Problem gefunden. Jetzt bleibt der Attiny85 nach dem Upload erkannt und beide Bibliotheken (RCSwitch und TrinketHidCombo) funktionieren einwandfrei. Auf folgender Seite war ich fündig geworden:
Diesen Code habe ich zusätzlich ins Setup gepackt:
TrinketHidCompatibleDelay(0); //increase to 2000 to remove the print errors entirely; decrease to 0 to make the errors worse and more frequent; use 1000 to cause occasional initial print errors only
TrinketHidCombo.begin(); // start the USB device engine and enumerate
//wait until connected to USB before continuing
//-note that isConnected() will change to true at that point
unsigned long counter = 0;
while (TrinketHidCombo.isConnected() == false)
{
counter++;
TrinketHidCombo.poll(); //The poll function must be called at least once every 10 ms, or you must command a keystroke. Otherwise, the computer may think that the device has stopped working, and give errors.
}
und diesen Code unter den Loop:
//--------------------------------------------------------------------------------------------
//TrinketHidCompatibleDelay
//-this is a USB-compatible delay, so that the 10ms max time between poll calls is not exceeded
//--------------------------------------------------------------------------------------------
void TrinketHidCompatibleDelay(unsigned int desiredDelay_ms)
{
unsigned long t_start = millis(); //ms
while (millis()-t_start<desiredDelay_ms)
{
TrinketHidCombo.poll(); //keep the HID USB connection to the computer alive
}
}
Ich verstehe den Code ehrlich gesagt nicht wirklich, es scheint aber um einen Delay bei der Initialisierung zu gehen. Interessant ist auch, dass es auch mit dem neuen Code nur klappt wenn ich im Setup einen Tastaturbefehl verschicke. In meinem Besispiel:
TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_UP);
Warum auch immer...so funktioniert das ganze wie gewünscht. Ich würde mich dennoch freuen wenn hier jemand aufklären kann warum das nun alles funktioniert;-)
Vollständigkeitshalber hier noch der komplette Code meines Projekts mittels eines Digispark ATtiny85 und einem 433Mhz Modul die Lautstärke an einem Windows 10 PC zu steuern:
#include <TrinketHidCombo.h>
#include <TrinketHidComboC.h>
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
void setup()
{
//USB CODE VON: https://github.com/adafruit/Adafruit-Trinket-USB/issues/20
TrinketHidCompatibleDelay(0); //increase to 2000 to remove the print errors entirely; decrease to 0 to make the errors worse and more frequent; use 1000 to cause occasional initial print errors only
TrinketHidCombo.begin(); // start the USB device engine and enumerate
//wait until connected to USB before continuing
//-note that isConnected() will change to true at that point
unsigned long counter = 0;
while (TrinketHidCombo.isConnected() == false)
{
counter++;
TrinketHidCombo.poll(); //The poll function must be called at least once every 10 ms, or you must command a keystroke. Otherwise, the computer may think that the device has stopped working, and give errors.
}
TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_UP);
mySwitch.enableReceive(0); // Empfänger ist an Interrupt-Pin "0" - Das ist am UNO der Pin2
}
void loop()
{
//DigiKeyboard.sendKeyStroke(0);
//DigiKeyboard.update();
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.
{
//DigiKeyboard.println("unbekannter code");
}
else // Wenn der Empfangene Code brauchbar ist, wird er hier an den Serial Monitor gesendet.
{
//DigiKeyboard.println( mySwitch.getReceivedValue() );
//DigiKeyboard.println(value);
if (value == 21589)
{
TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_UP);
}
if (value == 21588)
{
TrinketHidCombo.pressMultimediaKey(MMKEY_VOL_DOWN);
}
}
delay(100);
mySwitch.resetAvailable(); // Hier wird der Empfänger "resettet"
TrinketHidCombo.poll(); // check if USB needs anything done
}
}
//--------------------------------------------------------------------------------------------
//TrinketHidCompatibleDelay
//-this is a USB-compatible delay, so that the 10ms max time between poll calls is not exceeded
//--------------------------------------------------------------------------------------------
void TrinketHidCompatibleDelay(unsigned int desiredDelay_ms)
{
unsigned long t_start = millis(); //ms
while (millis()-t_start<desiredDelay_ms)
{
TrinketHidCombo.poll(); //keep the HID USB connection to the computer alive
}
}