Bonjour,
J'utilise la librairie IRremote de Shirrif et je voudrais faire le programme suivant:
Si bouton de la télécommande (=valeur du bouton pas ex. 0xFFA25D)enfoncé alors envoyer une valeur sur une broche en PWM ...
Si vous avez une idée
Merci
Louis
qu'avez vous essayé ? (il fournit plein d'exemples qui devraient vous aider)
J'ai essayé
if (IRremote == 0xFFA25D)
if (IRremote == 16753245)
if (IRremote == 0xFFA25D, HEX)
Mais les exemples nr foon pas : si bouton precis
Ils font si n'importe quel bouton est enfoncé
Merci
où avez vous vu dans les exemples faire if (IRremote == 0xFFA25D) ...
IRremote c'est la classe, ce n'est pas le résultat reçu... allez regarder comment il fait dans IRrecvDemo pour imprimer le code reçu...
void loop() {
if (irrecv.decode(&results)) { // SI ON A REÇU UN CODE
Serial.println(results.value, HEX); // <<<------ ALORS ON IMPRIME LE CODE EN HEXA
irrecv.resume(); // ET ON SE PREPARE À RECEVOIR LA PROCHAINE COMMANDE
}
delay(100);
}
Pardon,
Je me suis trompé, j'ai mis IRrequest et non pas IRremote ...
Mais dans IRrcecv c'est quand il capte une touche quelconque, moi c'est une touche specifique...
Merci
ce n'est pas IRrequest non plus...
Si vous avez la valeur qui s'affiche en imprimant results.value
, ce ne doit pas être bien sorcier de tester si ce results.value
a une valeur particulière non... ?
un nombre représenté en Hexadécimal va s'écrire par exemple [color=red]0x[/color]FFA25D
où le 0x dit au compilateur que la valeur est bien en Hexa.
Aucun résultat, donc marche pas non plus ...
(Désolé pour le retard)
Louis
Qu’est-ce qui ne marche pas... postez du code qui compile proprement avec les balises, on ne va pas jouer aux devinettes
@ludo c’est quasiment l’exemple de la bibliothèque pointé ci dessus, pas sur que ce soit ça qui l’aidera
Je suis sûr que Louis peut trouver
J'ai essayé : if (results.value == 0xFFA25D) avec toute l'initialisation habituelle
Mais pas de résulats
Merci
C’est la bonne façon de faire.
Est-ce que le programme qui affiche les valeurs fonctionne ? S’il ne fonctionne pas, c’est que vous avez un souci de montage sans doute
Marche toujours pas pourtant quand je vais dans les exemples avec lecture du code, ça marche...
Merci
Louis
postez tout votre code
#include <IRremote.h>
int TELECOMMANDE=0;
unsigned long IRCode = 0;
int IRpin = 10;
IRrecv irrecv(IRpin);
decode_results results;
unsigned long IRRequest ()
{
unsigned long IRResult = 0;
if (irrecv.decode(&results))
{
IRResult = results.value;
irrecv.resume(); // Receive the next value
}
return IRResult;
}
void setup() {
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
irrecv.resume();}
pinMode(IRpin, INPUT);
irrecv.enableIRIn();
pinMode(3, OUTPUT);
pinMode(5,INPUT);
}
void loop() {
if(((digitalRead(5))==(0))){
delay(120);
digitalWrite(9,0);
}
if (TELECOMMANDE==10); {//10
analogWrite(9,25.5);
}
if (TELECOMMANDE==10); {//20
analogWrite(9,51);
}
if (TELECOMMANDE==10); {//30
analogWrite(9,76.5);
}
if (TELECOMMANDE==10); {//40
analogWrite(9,102);
}
if (TELECOMMANDE==10); {//50
analogWrite(9, 127.5);
}
if (TELECOMMANDE==10); {//60
analogWrite(9,153);
}
if (TELECOMMANDE==10); {//70
analogWrite(9,178.5);
}
if (TELECOMMANDE==10); {//80
analogWrite(9,204);
}
if (TELECOMMANDE==10); {//90
analogWrite(9,229.5);
}
if (TELECOMMANDE==10); {//100
analogWrite(9,255);
}
if (IRRequest() == 16753245) {//ch-
TELECOMMANDE = TELECOMMANDE - 10;
irrecv.resume();
}
if (IRRequest() == 16769565) {//ch+
TELECOMMANDE = TELECOMMANDE + 10;
irrecv.resume();
}
if (IRRequest() == 16736813) {//ch
irrecv.resume();
}
if (IRRequest() == 16769055) {//-
TELECOMMANDE = TELECOMMANDE - 10;
irrecv.resume();
}
if (IRRequest() == 16754775) {//+
TELECOMMANDE = TELECOMMANDE + 10;
irrecv.resume();
}
if (IRRequest() == 1045037) {// <-
irrecv.resume();
}
if (IRRequest() == 16712445) {// ->
irrecv.resume();
}
if (IRRequest() == 16761405) {//play
analogWrite(3, 255);
irrecv.resume();
}
if(IRRequest() == 0x6897, 32) {//0
digitalWrite(3, 0);
irrecv.resume();
}
if (IRRequest() == 16724175) {//1
analogWrite(9,25.5);
irrecv.resume();
}
if (IRRequest() == 16718055) {//2
analogWrite(9,51);
irrecv.resume();
}
if (results.value == 0xFF7A85) {//3
analogWrite(3,0);
irrecv.resume();
}
if (IRRequest() == 16716015) {//4
analogWrite(9,102);
irrecv.resume();
}
if (IRRequest() == 16726223) {//5
analogWrite(9,127.5);
irrecv.resume();
}
if (IRRequest() == 16734885) {//6
analogWrite(9,153);
irrecv.resume();
}
if (IRRequest() == 16729533) {//7
analogWrite(9,178.5);
irrecv.resume();
}
if (IRRequest() == 16730805) {//8
analogWrite(9,204);
irrecv.resume();
}
if (IRRequest() == 16732845) {//9
analogWrite(9,229.5);
irrecv.resume();
}
if (IRRequest() == 0xFF9867, HEX) {//100+
analogWrite(3,255);
irrecv.resume();
}
if (IRRequest() == 16756815) {//200+
irrecv.resume();
}
if(IRRequest() == 0xFF9867) {
digitalWrite(3, 255);
irrecv.resume();
}
}
Un de vos problème c'est que vous ne pouvez pas appeler votre fonction plein de fois de suite dans les tests, à chaque fois elle essaye de lire une commande et si elle ne voit rien retourne 0
Quand on essaye de trouver une solution, on fait généralement un petit code tout simple pour voir si ça fonctionne. une fois qu'on a compris, on intègre cela dans le plus gros programme
j'ai tapé ça ici, à partir du code de démo pointé plus haut (console à 115200 bauds pour tester)
#include <IRremote.h>
const byte RECV_PIN = 10;
IRrecv irrecv(RECV_PIN);
decode_results results;
void actionTelecommande()
{
if (results.value == 16753245) { //ch-
Serial.println(F("CH-"));
} else if (results.value == 16761405) { //play
Serial.println(F("PLAY"));
} else {
Serial.print(F("0x"));
Serial.print(results.value, HEX);
Serial.println(F(" pas encore reconnue"));
}
}
void setup()
{
Serial.begin(115200);
irrecv.enableIRIn();
}
void loop() {
if (irrecv.decode(&results)) {
actionTelecommande();
irrecv.resume(); // prêt pour une nouvelle commmande
}
}
Sinon sur votre code:
Pourquoi mettre en début du setup
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
irrecv.resume();
}
pinMode(IRpin, INPUT);
ça va servir à quoi ? les exemples ne le font pas.....
Vous n'avez pas besoin de mettre plein de parenthèses et essayez de conserver la cohérence.... if (((digitalRead(5)) == (0))) {
vous pouvez simplement écrire if (digitalRead(5)) == LOW) { // retourne HIGH ou LOW
Pourquoi tous les tests sont identiques et ne correspondent pas au commentaire ?
if (TELECOMMANDE == 10); { //10
analogWrite(9, 25.5);
}
if (TELECOMMANDE == 10); { //20
analogWrite(9, 51);
}
if (TELECOMMANDE == 10); { //30
analogWrite(9, 76.5);
}
if (TELECOMMANDE == 10); { //40
analogWrite(9, 102);
}
if (TELECOMMANDE == 10); { //50
analogWrite(9, 127.5);
}
if (TELECOMMANDE == 10); { //60
analogWrite(9, 153);
}
if (TELECOMMANDE == 10); { //70
analogWrite(9, 178.5);
}
if (TELECOMMANDE == 10); { //80
analogWrite(9, 204);
}
if (TELECOMMANDE == 10); { //90
analogWrite(9, 229.5);
}
if (TELECOMMANDE == 10); { //100
analogWrite(9, 255);
}
et pourquoi faire ça à chaque tour de loop()? vous pouvez le faire une fois lorsque la valeur de TELECOMMANDE change....
Merci pour tous les conseils, j'essaierais plus tard, désolé.
Pour le setup je ne savais pas, merci, pareil pour le LOW au lieu du 0.
Pour les variables TELECOMMANDE, vous avez raison, j'ai oublié de changer les valeurs, c'était censé monter jusqu’à 100, je changerais; s'il y a des erreurs, je ne suis qu'un débutant qui manipule les codes par ci par là pour arriver a mon résultat, je ne connais pas trop les variable, donc j'ai fait comme j'ai pus ...
Merci encore pour tous les conseils !!!
Louis
s'il y a des erreurs, je ne suis qu'un débutant qui manipule les codes par ci par là pour arriver a mon résultat, je ne connais pas trop les variable, donc j'ai fait comme j'ai pu ...
ce serait bien de lire un petit tuto, ça vous aiderait à progresser et éviter des erreurs bêtes qui vous font perdre des heures...
Pour bien débuter avec l'arduino, un bon point de départ c'est de lire les tutos d'eskimon (et un cours de base sur le langage C et les bases du C++)