Uitgang puls met IR code zolang als ingedrukt FFFFFFFF

algemene C code
Berichten: 5
Geregistreerd: 08 Okt 2017, 22:34

Uitgang puls met IR code zolang als ingedrukt FFFFFFFF

Berichtdoor Runu88 » 08 Okt 2017, 22:48

Hallo allemaal,

ik ben nieuw op het forum en ook nieuw met arduino en de code. Een echte noob. Maar ik ben al redelijk ver gekomen met mijn project maar loop nu vast. Hopelijk kunnen jullie mij hierbij helpen.

Ik heb een arduino uno
ik gebruik een ir ontvanger op PIN 11 om ir codes te ontvangen
ik zie via de seriele monitor welke code hij ontvangt in HEX
met die code wil ik uitgang 2 tm 9 aansturen
uitgang 2 tm 9 mag alleen hoog worden zolang deze code ontvangen word. zorda ik hem loslaat moeten alle uitgangen laag worden.

als ik de knop van de IR zender vasthoud krijg ik eerst de hex code, en vervolgens FFFFFFF zolang ik de knop houd ingedrukt

de seriele monitor zier er dan als volgt uit:

1FE20DF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
1FE20DF
FFFFFFFF
FFFFFFFF
FFFFFFFF
10E03FC
FFFFFFFF
2D58
FFFFFFFF
FFFFFFFF
10E0DF2
FFFFFFFF


ik ben er al achter dat bijna alle IR zenders FFFFFFF gebruiken als herhaalcode.
ik zou graag willen dat zolang ik de knop op de ir zender vasthoud, de uitgang hoog blijft. zodra ik de knop op de ir loslaat moet de uitgang weer laag worden.

ik gerbuik nu de volgende code:

Code: Alles selecteren

#include <boarddefs.h>
#include <IRremote.h>
#include <IRremoteInt.h>
#include <ir_Lego_PF_BitStreamEncoder.h>
#include <IRremote.h>

int out2 = 2; //relais 1
int out3 = 3; //relais 2
int out4 = 4; //relais 3
int out5 = 5; //relais 4
int out6 = 6; //relais 5
int out7 = 7; //relais 6
int out8 = 8; //relais 7
int out9 = 9; //relais 8

int RECV_PIN = 11; //data out of IR receiver connects to pin 11


IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // start the receiver
  Serial.println("Enabled IRin");
  pinMode(out2, OUTPUT);
  pinMode(out3, OUTPUT);
  pinMode(out4, OUTPUT);
  pinMode(out5, OUTPUT);
  pinMode(out6, OUTPUT);
  pinMode(out7, OUTPUT);
  pinMode(out8, OUTPUT);
  pinMode(out9, OUTPUT);

}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
  else
  {
    results.value = 0x00000000;
  }

  if (results.value == 0x1FE20DF)
  {
    digitalWrite(out2, HIGH);
  }

  if (results.value == 0x1FEA05F)
  {
    digitalWrite(out3, HIGH);
  }

  if (results.value == 0x1FE609F)
  {
    digitalWrite(out4, HIGH);
  }

  if (results.value == 0x1FEE01F)
  {
    digitalWrite(out5, HIGH);
  }

  if (results.value == 0x1FE10EF)
  {
    digitalWrite(out6, HIGH);
  }

  if (results.value == 0x1FE906F)
  {
    digitalWrite(out7, HIGH);
  }

  if (results.value == 0x1FE807F)
  {
    digitalWrite(out8, HIGH);
  }

  if (results.value == 0x1FE40BF)
  {
    digitalWrite(out9, HIGH);
  }

  if (results.value == 0xFFFFFFFF) return;


  if (results.value = 0x00000000)
  {
    digitalWrite(out2, LOW);
    digitalWrite(out3, LOW);
    digitalWrite(out4, LOW);
    digitalWrite(out5, LOW);
    digitalWrite(out6, LOW);
    digitalWrite(out7, LOW);
    digitalWrite(out8, LOW);
    digitalWrite(out9, LOW);
    return;
  }


}



ik doe iets verkeer of ik zie iets over het hoofd. maarja ik heb er dus ook niet zoveel verstand van. zouden jullie mij willen helpen ?

:D :D :D

Advertisement

Gebruikers-avatar
Berichten: 1776
Geregistreerd: 06 Aug 2016, 01:03

Re: Uitgang puls met IR code zolang als ingedrukt FFFFFFFF

Berichtdoor Koepel » 08 Okt 2017, 23:14

Hallo, en welkom op dit forum.

Helaas heb ik nog niet met de IRremote library gewerkt :(

Maar als programmeerprobleen zie ik wel een logische oplossing.

Je krijgt geen code bij het loslaten van een knop ? Dus dan heb je misschien een software timer nodig, die bijvoorbeeld na 100ms de uitgangen weer laag maakt. Met een software timer bedoel ik het gebruik van millis: https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay.
Verder heb je een variabele nodig om het laatste commando te onthouden, dan weet je bij een 0xFFFFFFFF welk commando nog bezig is.

Maar ik weet niet wanneer je 0x00000000 terug krijgt. Ontvang je dat ook tussen de 0xFFFFFFFF door ?

Berichten: 5
Geregistreerd: 08 Okt 2017, 22:34

Re: Uitgang puls met IR code zolang als ingedrukt FFFFFFFF

Berichtdoor Runu88 » 09 Okt 2017, 09:57

De 0x0000000 heb ik er zelf tussen gezet zodat als de ir ontvanger niets ontvangt, 0x000000 word gegeven. Zodra hij 0x000000 krijgt worden alle uitgangen weer laag.

Zou je misschien een voorbeeld kunnen plaatsen ?

Gebruikers-avatar
Berichten: 1776
Geregistreerd: 06 Aug 2016, 01:03

Re: Uitgang puls met IR code zolang als ingedrukt FFFFFFFF

Berichtdoor Koepel » 09 Okt 2017, 12:28

Het is niet de bedoeling dat ik jouw sketch ga schrijven. Als jij code hebt die je niet begrijpt, dan kun je er verder niets mee. Heb je de BlinkWithoutDelay goed doorgelezen ?

Ik ken die IRremote library dus niet :? Het gaat om de situatie dat iemand een knop ingedrukt houdt.
Ik neem aan dat de afstandsbediening codes verstuurt, waarschijnlijk snel achter elkaar met weinig tussenpauze.
Ik neem aan dat irrecv.decode() snel werkt, en tussen de codes ook veel 'false' returned, dat er dan geen code is, terwijl de knop op de afstandsbediening toch steeds ingedrukt is.

Volgens mij krijg je twee delen.
Een software timer met een globale variabele unsigned long previousMillis; en een globale variabele boolean timerActive;. Ik geef er de voorkeur aan om met een boolean variabele aan te geven of de software timer op dat moment actief is.

Dan bij het ontvangen van goede code:
Code: Alles selecteren
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
    previousMillis = millis();    // make a timestamp of this event.
    timerActive = true;
  }


Op die manier weet je wanneer de laatste goede code was ontvangen.

Vervolgens heb je de waarde van de vorige keer nodig. Dus een globale variabele unsigned long previousValue;
En voor dat je de loop() verlaat: previousValue = results.value;

Vervolgens zijn er twee belangrijke momenten:
Moment uitgang wordt hoog:
Dat is eenvoudig. Krijg je bijvoorbeeld een 0x1FE20DF code, dan zet je die uitgang hoog.
Moment uitgang wordt laag:
Dat kan op twee manieren. Of de software timer loopt af, of een nieuwe code is ingedrukt. Maar 0xFFFFFFF is geen nieuwe code. Om te bepalen of nieuwe code is ingedrukt vergelijk je de huidige code met de previousValue.

Kun hier wat mee ? Probeer er iets van de maken. Met die software timer help ik je natuurlijk. De if-statements om te bepalen of een uitgang laag wordt, daar mag je zelf op kauwen.

Berichten: 5
Geregistreerd: 08 Okt 2017, 22:34

Re: Uitgang puls met IR code zolang als ingedrukt FFFFFFFF

Berichtdoor Runu88 » 09 Okt 2017, 18:54

IK heb de blinkwithoutdelay doorgelezen en dat begrijp ik wel, ik heb de code in de sketch gezet en ontvang nu maar 1 waarde per ingestelde tijd. maar desontdanks blijf ik dan wel FFFFFFF ontvangen.

ik begrijp niet goed waarom als hij 0xFFFFFFF hij niet terug gaat naar het begin van de loop. en dus verder niets met de outputs doet. ik verwacht nu ook dat na de interval is afgelopen hij dan de outputs low zet.


ik heb nu de volgende sketch

cpp code
#include <boarddefs.h>
#include <IRremote.h>
#include <IRremoteInt.h>
#include <ir_Lego_PF_BitStreamEncoder.h>
#include <IRremote.h>

int out2 = 2; //relais 1
int out3 = 3; //relais 2
int out4 = 4; //relais 3
int out5 = 5; //relais 4
int out6 = 6; //relais 5
int out7 = 7; //relais 6
int out8 = 8; //relais 7
int out9 = 9; //relais 8

int RECV_PIN = 11; //data out of IR receiver connects to pin 11


IRrecv irrecv(RECV_PIN);

decode_results results;

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0; // will store last time LED was updated

// constants won't change:
const long interval = 500; // interval at which to blink (milliseconds)

void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // start the receiver
Serial.println("Enabled IRin");
pinMode(out2, OUTPUT);
pinMode(out3, OUTPUT);
pinMode(out4, OUTPUT);
pinMode(out5, OUTPUT);
pinMode(out6, OUTPUT);
pinMode(out7, OUTPUT);
pinMode(out8, OUTPUT);
pinMode(out9, OUTPUT);

}

void loop() {
// here is where you'd put code that needs to be running all the time.

// check to see if it's time to blink the LED; that is, if the difference
// between the current time and last time you blinked the LED is bigger than
// the interval at which you want to blink the LED.
unsigned long currentMillis = millis();


if (currentMillis - previousMillis >= interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;

if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
irrecv.resume(); // Receive the next value
previousMillis = millis(); // make a timestamp of this event.


}
}
else

if (results.value == 0x1FE20DF)
{
digitalWrite(out2, HIGH);
}

if (results.value == 0x1FEA05F)
{
digitalWrite(out3, HIGH);
}

if (results.value == 0x1FE609F)
{
digitalWrite(out4, HIGH);
}

if (results.value == 0x1FEE01F)
{
digitalWrite(out5, HIGH);
}

if (results.value == 0x1FE10EF)
{
digitalWrite(out6, HIGH);
}

if (results.value == 0x1FE906F)
{
digitalWrite(out7, HIGH);
}

if (results.value == 0x1FE807F)
{
digitalWrite(out8, HIGH);
}

if (results.value == 0x1FE40BF)
{
digitalWrite(out9, HIGH);
}

if (results.value == 0xFFFFFFFF) return;

else
{
digitalWrite(out2, LOW);
digitalWrite(out3, LOW);
digitalWrite(out4, LOW);
digitalWrite(out5, LOW);
digitalWrite(out6, LOW);
digitalWrite(out7, LOW);
digitalWrite(out8, LOW);
digitalWrite(out9, LOW);
}

}



ik verwacht ook niet dat iemand anders mijn sketch gaat schrijven, en ik wil het zelf ook allemaal begrijpen. maar dit is echt abracadabra voor mij :)

Gebruikers-avatar
Berichten: 4863
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Uitgang puls met IR code zolang als ingedrukt FFFFFFFF

Berichtdoor nicoverduin » 09 Okt 2017, 20:18

Ik betwijfel ten sterkste of je blink without delay echt snapt...de timer heb je lokaal gedefinieerd terwijl dat een globale variabele moet zijn. Elke keer als de loop klaar is, is je timer verdwenen en wordt bij de start opnieuw gemaakt.
De timer moet je pas zetten als je fffffffff binnen krijgt. En elke keer bij een nieuwe herhaal code. In een apart deel in de loop test je de timer of deze is verlopen. Zo ja dan alle uitgangrn low.
Krijg je een andere code dan zet je de timer uit( bijv een bool die aangeeft of de timer loopt.
Je moet dus eigenlijk 2 aparte stukken in de code krijgen. Aftesten van de timer Als deze loopt. Inlezen code en aftesten ertusen. En let dan op wat je moet doen bij die repeat code. Dus niet zomaar een return code geven. Evt eerdt met een flow chart alles uitwerken en dan coderen....dus eerst denken en dan doen. En gokken doe je in Zandvoort:)
Docent HBO Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 5
Geregistreerd: 08 Okt 2017, 22:34

Re: Uitgang puls met IR code zolang als ingedrukt FFFFFFFF

Berichtdoor Runu88 » 09 Okt 2017, 20:45

nicoverduin schreef:Ik betwijfel ten sterkste of je blink without delay echt snapt...de timer heb je lokaal gedefinieerd terwijl dat een globale variabele moet zijn. Elke keer als de loop klaar is, is je timer verdwenen en wordt bij de start opnieuw gemaakt.
De timer moet je pas zetten als je fffffffff binnen krijgt. En elke keer bij een nieuwe herhaal code. In een apart deel in de loop test je de timer of deze is verlopen. Zo ja dan alle uitgangrn low.
Krijg je een andere code dan zet je de timer uit( bijv een bool die aangeeft of de timer loopt.
Je moet dus eigenlijk 2 aparte stukken in de code krijgen. Aftesten van de timer Als deze loopt. Inlezen code en aftesten ertusen. En let dan op wat je moet doen bij die repeat code. Dus niet zomaar een return code geven. Evt eerdt met een flow chart alles uitwerken en dan coderen....dus eerst denken en dan doen. En gokken doe je in Zandvoort:)



Beste nico,

ik heb de timer daar neergezet op advies van koepel.
zoals ik al zei heb ik echt totaal geen verstand van deze code, dus ja ik moet wel een beetje gokken. van origine ben ik elektricien maar dat is totaal iets anders als wat ik hier voor mijn kiezen krijg. ik wil het heel graag begrijpen, maar het lukt me nog niet echt. de antwoorden die ik krijg weet ik niet hoe ik deze moet verwerken in de code. ik heb het echt onderschat merk ik wel.

Gebruikers-avatar
Berichten: 1776
Geregistreerd: 06 Aug 2016, 01:03

Re: Uitgang puls met IR code zolang als ingedrukt FFFFFFFF

Berichtdoor Koepel » 09 Okt 2017, 23:29

Het gaat om de opbouw van de sketch.

Wanneer je een huis bouwt, dan kun je de dakpannen ergens neerleggen, daar de bakstenen overheen en dan het beton van de fundering er overheen storten. En dan vervolgens zeggen dat als je op een schakelaar drukt dat dan het licht niet aan gaat :lol:
Daarom zeggen wij, je kunt niet zomaar wat code neerzetten en er op gokken dat het werkt. Je zult er echt over na moeten denken.

Een programmeur kan zien hoe een probleem in de echte wereld een bepaalde logica heeft. Wat iedere programmeur vervolgens doet is het probleem opdelen in verschillende stukken.
Maar no worries, we slepen je er wel doorheen.

Wanneer je niet bekent bent met een flow chart of andere dingen, dan mag je ook een goede beschrijving geven.

Het moment dat een knop wordt losgelaten weet je niet. Als er een tijdje niets meer binnenkomt, dan kun je aannemen dat de knop is losgelaten. En daar is die software timer met millis() voor.

Ik geef je een indeling van de loop() en ik maakt het eerste deel voor je.

Code: Alles selecteren
void loop()
{
  unsigned long value;

  // currentMillis can be useful.
  unsigned long currentMillis = millis();
 
  // ----------------------------------------
  // Get data from the remote control
  // ----------------------------------------

  if (irrecv.decode(&results))
  {
    value = results.value;     // The received value
    irrecv.resume();               // Get ready for next value to be received

    Serial.println(value, HEX);
    previousMillis = millis();    // make a timestamp of this event.
    timerActive = true;         // activate the software timer.
  }
  else
  {
    // value 0 is used in the sketch as being not a valid received code.
    value = 0;
  }


  // ----------------------------------------
  // Set output when a new code was received.
  // ----------------------------------------



  // ----------------------------------------
  // Check if nothing was received for a while.
  // ----------------------------------------


Zie je wat ik doe in het ingevulde onderdeel ? Daar komen drie variabelen uit: "value", "previousMillis", "timerActive". Die drie variabelen stuur ik de sketch in. In de sketch wordt dat verder verwerkt.
Begrijp je dat het een los onderdeel is, en dat ik drie variabelen de sketch in stuur ?
Je mag natuurlijk ook in het deel dat een goede code is ontvangen de uitgangen gaan zetten zoals je eerst had. Maar dan is het geen los onderdeel meer. Je mag het uitpluizen van de ontvangen code (de 'value') en de uitgangen zetten in een functie zetten. Dat maakt de sketch een stuk leesbaarder.

Ik wil nog een goede beschrijving van je wat er moet gebeuren als zonder pauze een nieuwe knop wordt ingedrukt. Dan kun je er van uit gaan dat de vorige knoop is losgelaten.

Gebruikers-avatar
Berichten: 4863
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Uitgang puls met IR code zolang als ingedrukt FFFFFFFF

Berichtdoor nicoverduin » 10 Okt 2017, 07:25

Ik zou zelf die timer gezet hebben bij een repeat code. Het stukje timer verloopt als apart stuk.
cpp code
Als timer_loopt
Als timer is verlopen
Alle uitgangen op low
Timer_loopt = false
Einde als
Einde als
]

Verder
Na het lezen van een ir code
cpp code
als de code = ffffffff
Als de timer niet loopt
Start de timer
Timer_loopt = true
Einde als
Anders
Timer_loopt = false
Verwerk de codes
Einde als
Docent HBO Software Engineering, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 1776
Geregistreerd: 06 Aug 2016, 01:03

Re: Uitgang puls met IR code zolang als ingedrukt FFFFFFFF

Berichtdoor Koepel » 10 Okt 2017, 08:52

@nicoverduin, ik had al gelezen in je beschrijving dat je de timer op een andere manier wilt starten. Dat had ik nog willen vragen.
Ik wil ook nog van @Runu88 precies weten wat er in welke situatie moet gebeuren, en ik ken de IRremote library niet.

Wat als er "1FE20DF", "10E03FC", "FFFFFFFF", "FFFFFFFF", "FFFFFFFF" binnen komt. Dus er wordt heel snel overgeschakeld van de ene naar de andere knop.
Wat als er een code binnenkomt die wel van een knop is, maar niet in de sketch wordt verwerkt. Bijvoorbeeld: "1000000", "FFFFFFFF", "FFFFFFFF".
Het is toch de bedoeling dat alleen het moment van een knop indrukken en het moment van een knop loslaten wordt gedetecteerd. Er hoeft tussendoor toch niets gedaan te worden als al die "FFFFFFFF" ontvangen worden ?

Het einde van de timer hebben we hetzelfde.
Dit:
Code: Alles selecteren
  // ----------------------------------------
  // Check if nothing was received for a while.
  // ----------------------------------------
is hetzelfde als dit:
cpp code
Als timer_loopt
Als timer is verlopen
Alle uitgangen op low
Timer_loopt = false
Einde als
Einde als


Voor het starten van de timer leek het mij voldoende om consequent bij iedere ontvangen code de timer te starten.
Stel iemand drukt heel snel een knop in, dan komt er alleen "1FE20DF" en verder niets. Dan er is toch een timeout nodig. Daarom gebruik ik de "FFFFFFFF" alleen maar om de timeout te verlengen.
Heb jij wel met de IRremote library gewerkt? Ik ga er van uit dat de loop sneller draait dan dat de codes binnenkomen.

Volgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Google [Bot] en 1 gast