Digitalen Ausgang einlesen?

Hello again,

danke für die Antworten zu meinen letzten Posts, war leider ne Weile afk …
Aber kaum den Arduino angeschmissen, schon muss ich euch wieder mit meinen Problemen beschäftigen … :stuck_out_tongue:

#include <IRremote.h>

int RECV_PIN = 52;
int R1 = 46;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
pinMode(R1, OUTPUT);
Serial.begin(9600);
irrecv.enableIRIn(); 
}

void loop() 
 {
 if (irrecv.decode(&results)) {
  Serial.println(results.value, HEX);
  
  if (results.value == 0x9716BE3F) {  // 1
   digitalWrite(R1, HIGH);
  }
  if (results.value == 0xC101E57B) {  // 0
   digitalWrite(R1, LOW);
  }
  irrecv.resume();
 }
}

Damit kann ich über eine IR Fernbedienung, mit Hilfe von zwei Tasten einen Ausgang Ein und Aus schalten. :astonished:
Nun dachte ich, ich können einen Ausgang mit einer Taste Ein und Aus schalten. Das wollte ich so versuchen.

if ((results.value == 0x9716BE3F) && R1 == LOW) {  // 1
   digitalWrite(R1, HIGH);

Dazu müsste ich aber wissen, was mein R1 grad fürn Zustand hat.
Habt ihr n Tip, wie ich das rausfinden kann?

Und vllt schonmal n hilfreichen Link für mein nächstes Thema … Led dimmen, 12V, 1A … mit der bereits erwähnten Fernbedienung…

Danke.
Lg Jim

Evtl. so

if ((results.value == 0x9716BE3F) && digitalRead(R1) == LOW) {  // 1
   digitalWrite(R1, HIGH);

Nicht bei allen Controllermodellen funktioniert das Auslesen eines auf Ausgang geschaltenen Pins mittels digitalRead. Einfacher ist es eine Variable zu nehemn die den Pinzustand speichert.
Grüße Uwe

toggle:
digitalwrite(N,!digitalread(n));

..oder..: check PIND (in referance)

#include <IRremote.h>

int RECV_PIN = 52;
int R1 = 46;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
pinMode(R1, OUTPUT);
Serial.begin(9600);
irrecv.enableIRIn(); 
}

void loop() 
 {
 if (irrecv.decode(&results)) {
  Serial.println(results.value, HEX);
  
  if ((results.value == 0x3EC3FC1B) && digitalRead(R1) == LOW) // 9
  { 
   delay(300);
   digitalWrite(R1, HIGH);
  }
  else
  {
   digitalWrite(R1, LOW);
  }
  irrecv.resume();
 }
}

Ja, danke. Der MEGA scheint das zu können.

uwefed:
Nicht bei allen Controllermodellen funktioniert das Auslesen eines auf Ausgang geschaltenen Pins mittels digitalRead. Einfacher ist es eine Variable zu nehemn die den Pinzustand speichert.
Grüße Uwe

Die Variante werd ich aber auch mal probieren, könnte mir beim nächsten Problem weiter helfen, hoffe ich.
Ich würd gern einen PWM Ausgang in zehn Stufen ( per Fernbedienung ) von Min (0) bis Max (250) schalten, bei Max wieder auf 0.
Folgender Sketch sollte diese Aufgabe erfüllen … tut er aber leider nicht ganz …

#include <IRremote.h>

int RECV_PIN = 52;
int PWMpinR1 = 2;
int val = 0;
int var = 0;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); 
pinMode(PWMpinR1, OUTPUT);
}

void loop() 
 {
 if (irrecv.decode(&results)) 
  {
  Serial.println(results.value, HEX);
  
  if ((results.value == 0x9716BE3F) && analogRead(PWMpinR1) == 0)   // 1
   {
    val = 25;
    analogWrite(PWMpinR1, val);
   }
  else  
   {
    var = analogRead(PWMpinR1) + 25;
    analogWrite(PWMpinR1, var);
    if (var == 250)
     {
      val = 0;
     }
   }
   Serial.println(analogRead(PWMpinR1));
   irrecv.resume();
  }
 }

Was fürn Bauteil brauche ich, wenn ich damit eine 12V, 10W, knapp 1A LED dimmen möchte. Zwischen dem PWM Ausgang und dem 12V Stromkreis?

Danke.

HcBenjy:
Was fürn Bauteil brauche ich, wenn ich damit eine 12V, 10W, knapp 1A LED dimmen möchte. Zwischen dem PWM Ausgang und dem 12V Stromkreis?

Genaue LED-Spezifikation? Datenblatt? Link?

Wenn das ein 12 Volt Leuchtmittel ist, das nicht als dimmbar verkauft wird, kannst Du das gar nicht dimmbar machen.

Und wenn es ein LED-Emitter mit der Leistungsangabe 12V/10W ist, der mit Konstantstrom betrieben werden muss, dann benötigst Du eine Konstantstromquelle, die Du auf den gewünschten Konstantstrom einstellen kannst und die per PWM dimmbar ist.

Mal kurz bei eBay gesucht, sowas wie eBay Nummer 131199753302 kommt in Frage, wenn Du das Stellpoti ablötest und dafür ein PWM-Signal vom Arduino zum Regeln verwendest.

Example uses remote control to drive a motor… inscreasing/decreasing speed

#include <IRremote.h>

byte kode; // code from remotecontrol

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
int m1=5; // pwm output to Motor
int m2=6; // pwm output to Motor
int spd; //-255 -> 255 (speed)
const int fwd=23;  // remotecode  forward
const int rvs=55; // reverse
const int stopp=253; //stop


void setup()
{   
  Serial.begin(9600);
  pinMode(m1,OUTPUT); 
  pinMode(m2,OUTPUT);
  digitalWrite (m1,0);
  digitalWrite (m2,0);
  irrecv.enableIRIn();
}

void mupdate() // MOTOR UPDATE 
{
  if(spd>=0)
  {
    digitalWrite(m1,0); 
    analogWrite(m2,spd);
  }
  else
  {
    digitalWrite(m2,0);
    analogWrite(m1,-spd);
  }
}


void loop()
{
  kode=0; // no code yet
  if (irrecv.decode(&results)) 
  {
    kode=results.value & 255;  // MASK AWAY ALL BUT LAST 8 BITS to simplify numbes
    irrecv.resume(); // Receive the next value
  }
 
 switch(kode)
  {
  case fwd: // speed up
    { 
      if(spd<200) spd+=50;
      mupdate() ; 
      break;
    }
  case rvs:
    {
      if(spd>-200) spd-=50; // slow down
      mupdate() ;
      break;
    }
  case stopp:
    { 
      spd=0;
      mupdate() ;
      break;
    }
  }
}

jurs:
Datenblatt? Link?
131199753302

China... :blush:
http://www.eachbuyer.com/5-10w-high-power-bright-led-warm-white-light-lamp-bulb-diy-3000-3200k-9-12v-p15223.html
Ja, sowas wie 131199753302 dachte ich mir. Das sollte mit der Idee des Codes machbar sein?!
Ich stellte es mit vllt etwas weniger aufwändig vor, das Bauteil ...

knut_ny:
Example uses remote control to drive a motor.. inscreasing/decreasing speed

I ll try to figure out how that code works, and which parts i can use for mine. But it ll take some days, i guess ..

HcBenjy:
Ja, sowas wie 131199753302 dachte ich mir. Das sollte mit der Idee des Codes machbar sein?!
Ich stellte es mit vllt etwas weniger aufwändig vor, das Bauteil ...

Bauteil Punkt Punkt Punkt, wie meinen?

Ja, das ist ein nackter LED-Emitter, den Du mit der eBay KSQ befeuern und per PWM in der Helligkeit regeln kannst.

Und ja, man kann auf dem Arduino auch einen Sketch machen, der die Helligkeit per IR-Fernbedienung regelt.

Dass Du solche Power-LEDs nur mit Kühlung von der ersten Betriebssekunde an betreiben darfst, oder andernfalls bereits mit schwerer Schädigung der LED nach fünf Betriebssekunden gerechnet werden muß, ist Dir hoffentlich klar und Du hast ausreichend Kühlkörperfläche eingeplant?!

Vielleicht kleiner.
Was steckt in sowas drin?

Die Box is zwar nicht klein, aber was da drin ist, ist so klein, dass ich die Beschriftung nicht mehr erkennen kann ...
Und die LED flackert nach dem Dimmer ? Warum, weiß ich noch nicht.
Punkte ... benutz ich, ka warum, häufig ... gern..

Oben hab ich einen Sketch gepostet, der sowas können sollte ... aber leider noch nicht kann.
Zum "testen" sind die LEDs auf einer wassergekühlten Cu-Platte und im evtl geplanten Design ist ausreichend Platz um passiv zu kühlen.

Als Versorgung dient ein PC Netzteil.
Eigentlich würds auch reichen nur den Strom regeln zu können.

HcBenjy:
Was steckt in sowas drin?
http://www.amazon.de/Kabellos-Regler-Dimmer-Strip-LED-Controller/dp/B009J4UZV2/ref=sr_1_10?ie=UTF8&qid=1403457970&sr=8-10&keywords=led+dimmer

Da das Ding zur Versorgung von Lichterketten mit KONSTANTSPANNUNG von 12V vergesehen sind, dürfte da einfach ein Leistungsschalter drin sitzen, irgendwas mit MosFet vielleicht. Schaltet im PWM Takt einfach die 12 V ein und aus. Null Regelung. Und zum Anschließen an solche LED-Emitter wie Du sie hast, die mit KONSTANTSTROM versorgt werden müssen, komplett ungeeignet.

HcBenjy:
Die Box is zwar nicht klein, aber was da drin ist, ist so klein, dass ich die Beschriftung nicht mehr erkennen kann ...
Und die LED flackert nach dem Dimmer ? Warum, weiß ich noch nicht.

Letzte Warnung vom Netzteil: Das ist die ansprechende Überlastsicherung und sie morst Dir gerade SOS, bevor Du das Teil himmelst.

Dein Emitter mit einer Vorwärtsspannung laut Spezifikation zwischen 9 und 12 hat dürfte tatsächlich ungefähr in der Mitte liegen, also bei ca. 10,5 Volt, wenn er seinen Nennstrom zieht. Bei 12 Volt zieht so ein Emitter dann bereits so ungefähr das (geschätzt) achtfache seines Nennstroms, falls das Netzteil es schaffen würde, auch den achtfachen Nennstrom tatsächlich bei 12 Volt zu liefern. Dass kann das Netzteil natürlich nicht (es sei denn, Du hättest es extrem überdimensioniert), die Spannung bricht zusammen, es flackert.

Total falsche Beschaltung mit Netzteilüberlastung.
Es flackert als letzte Warnung. Danach kämen dann nur noch Rauchwölkchen, wenn Du so weiterbastelst.

HcBenjy:
Oben hab ich einen Sketch gepostet, der sowas können sollte ... aber leider noch nicht kann.

Oh, oh!
Die Funktion analogRead() ist NICHT das Gegenteil von analogWrite() und hat damit absolut NICHTS zu tun. Der Sketch ist nicht nur knapp daneben, der ist Dir vollkommen mißraten, wenn Du damit über eine IR-Fernbedienung die Helligkeit regeln möchtest. Na ja, nicht ganz, die Funktion analogWrite(PWMpinR1, var); zum Setzen eines Helligkeitswertes ist schon richtig. Nur der Rest drumherum nicht.

analogRead(PWMpinR1) liest definitvi NICHT den Wert aus auf den ein PWM Ausgang gestellt ist. Ich weiß nicht es ob durch direktes auslesen der PWM-Register möglich wäre, aber viel einfacher ist, Du nimmst eine Variable.

 if ((results.value == 0x9716BE3F) && analogRead(PWMpinR1) == 0)   // 1
   {
    val = 25;
    analogWrite(PWMpinR1, val);
   }
  else  
   {
    var = analogRead(PWMpinR1) + 25;
    analogWrite(PWMpinR1, var);
    if (var == 250)
     {
      val = 0;
     }
   }

Du weißt schon daß der Wert um 25 incrementiert wird auch wenn eine Falsche Taste gedrückt wird. Durch das else werden alle Möglichkeiten abgedeckt, wennPWM null ist und wenn results.value nicht 0x9716BE3F ist.

So funktionierts. Du mußt keine Unterscheidung machen ob PWM null ist oder einen anderen Wert hat.

int PWMwertR1=0;
...
if (results.value == 0x9716BE3F)    // 1
   {
    PWMwertR1 += 25;
    analogWrite(PWMpinR1, PWMwertR1);
    if (var >= 250)   // besser >= als ==
     {
      PWMwertR1 = 0;
     }
   }

Grüße Uwe

jurs:
himmelst.

Schöner Ausdruck. Aber ja, ich hab schon einige Bauteilseelen gesammelt ... ]:slight_smile:
Das passiert mal ...
In diesem Fall dachte ich aber nicht, dass es an der Versorgung scheitern würde. Ohne den Dimmer flackerts nicht.
http://s7.directupload.net/images/140623/nxre9k5k.jpg

analogRead und Write hab ich mir nochmal angeschaut und ja, erst lesen, dann anwenden ist manchmal besser. :slight_smile:

Jetzt muss ich erstmal den unterschied zwischen + und += rausfinden.
Den hab ich immer noch nicht ganz, obwohl isch schon dreimal gelesen hab. -.-
Ich würd auch immer gern verstehen, warum der Sketch funktioniert. Das dauert manchmal ...

So long

var += 25;

ist die Kurform von

var = var + 25;

Hallo,
Oerator "+"

int Wert = 10;

Wert + 5 , 10 + 5 = 15, Wert bleibt immer 10

Oerator "+="

Wert += 5, 10 = 10 + 5 = 15, Wert erhöht sich um 5
Gruß und Spaß
Andreas

Serenifly:

var += 25;

ist die Kurform von

var = var + 25;

Es gibt auch
var ++; ( incrementiert die Variable um 1)
++var; ( incrementiert auch die Variable aber vor der Benutzung).

Beispiel
Serial.print(++var);

das gleiche gilt für -= oder --

Grüße Uwe

uwefed:
analogRead(PWMpinR1)...auch wenn eine Falsche Taste gedrückt wird...

Ja, das mit dem else hab ich nu verstanden.
Da ich annahm, dass analogRead mir den Wert, der jetzt in der Variablen gespeichert wird, wiedergibt und

var += 25;

gleich

var = var + 25;

(wobei var = analogen Ausgang sein sollte)
ist, war die Idee ja gar nicht so falsch .. :stuck_out_tongue:

uwefed:
var ++; ++var

Wofür man das brauchen könnte, weiß ich noch nicht so wirklich ...

Danke mal wieder. Die Sketche funktionieren soweit und warum, weiß ich nun auch.
Gibts hier auch n Forum für Elektronik Grundlagen -> Stromquellen?

Lg Jim

Post-Fix Inkrement für Array Indizes

buffer[index++] = Serial.read();

Liest von der seriellen Schnittstelle, schreibt den Wert in den Puffer und inkrementiert danach den Index

Prä-Fix ist selten, aber was uwe schon geschrieben hat:

Serial.print(++var);

Wenn man aus irgendeinem Grund erst den Wert erhöhen will und danach ausgeben.

Man kann sowas natürlich auch immer in zwei Zeilen schreiben, wenn man das für besser lesbar oder sicherer hält.

Serenifly:

Serial.print(++var);

Wenn man aus irgendeinem Grund erst den Wert erhöhen will und danach ausgeben.

Oder wenn man die Variable erst erhöhen, dann ausgeben und dann gleich nochmal erhöhen möchte:

Serial.println((++i)++);

]:slight_smile: