INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
IR Sende / Empfänger Klasse - wo hier deponieren?
15.09.2013, 13:00
Beitrag #1
IR Sende / Empfänger Klasse - wo hier deponieren?
Hallo,

ich habe für den TSOP 1740 IR Emfpänger und einen Sender sehr saubere und knackige Routinen geschrieben mit denen man Datensätze, Sructs usw versenden kann. Eigenes Protokoll mit Checksumme, Statemachine usw.

Nur Send_IR(void* Quelle, Länge) und alles andere macht der Arduino bzw der Empfänger, bei mir ein Nano.

Ich wollte noch ne Klasse draus machen aber es ist so kurz, dass es auch als Sketch durchgeht. Ist allerdings nur Arduino fähig, da es desse eingebaute Funktionen verwendet.

Wo kann man das hier ablegen in diesem Forum damit auch andere es verwenden können?

Beispiel:

PHP-Code:
/*
    Modul: utils.ino
    
    Hier stehen Routinen, die diverse Funktionen ausfuehren

*/

#define ONE_TIME   1200    // "1"
#define ZERO_TIME  600     // "0" 
#define START_MARK 2400    // Start des Datensatzes
#define END_MARK   1800    // Ende des Datensatzes 
#define TOL        200     // Toleranz der Datenbits nach beiden Seiten

// TRUE wenn Zahl zwischen Limits liegt
boolean IsInRange(uint16_t zahluint16_t lowuint16_t high)
{
  return((
zahl >= low) && (zahl <=high));
}  

// Globals.....

uint8_t IR_decode(uint16_t period)
{
   
   static 
uint8_t databyte 0;
   static 
uint8_t bitcount 0;
   static 
uint8_t*  bufptr;
      
   
// Warte auf Starttoken
     
if (state == 0) {
       
// Start erkannt?
       
if (IsInRange(period,START_MARK-TOL,START_MARK+TOL)) 
       {
         
debug("[START] ");
         
// Empfang des Datensatz vorbereiten
         
bufptr         IR_Data.rec_buffer;
         
IR_Data.BytesReceived 0;
         
databyte       0;
         
bitcount       0;
         
state 1;
         return 
0;
       } 
// if (IsInRange...
     
// if (state == 0) ...

      // ---------------------------------

     // Bits empfangen
    
if (state == 1)  {
       
// Eine 1?
       
if (IsInRange(period,ONE_TIME-TOL,ONE_TIME+TOL)) { 
          
databyte = (databyte >> 1) | 0x80;
          
bitcount ++;
          
digitalWrite(LED_GRN,HIGH);
          
digitalWrite(LED_GLB,LOW);
          
       } 
// if (IsInRange ...
  
       // Eine 0?
       
else if (IsInRange(period,ZERO_TIME-TOL,ZERO_TIME+TOL)) { 
          
databyte databyte >> 1
          
bitcount ++;
          
digitalWrite(LED_GRN,LOW);
          
digitalWrite(LED_GLB,HIGH);
       } 
       
       
// Datensatz zu Ende?
       
else if (IsInRange(period,END_MARK-TOL,END_MARK+TOL))
       {       
           
state 3;
           goto 
state3;
       }        
       
// Sonst Fehler, Statemachine reset und raus
       
else {
              
IR_active FALSE;
              
IR_valid  FALSE;
              
state 0;
              return 
0;
       }
   
       
// ---- Auswertung ----
       
       // Komplettes Byte eingetroffen, dann wegschreiben...  
       
if (bitcount>7) {
             *(
bufptr++) = databyte;    // Byte in Buffer
             
IR_Data.BytesReceived++;
             
bitcount 0;
//             if (databyte > 0x0f) {
//               debug(databyte,HEX); debug(" ");
//             } else {
//                debug("0"); debug(databyte,HEX); debug(" ");
//             }  
       
// if (bitcount>7) ...

    
// else if (state == 1) ... 
     
    // ---------------------------------   

state3:
    
    if (
state == 3)
    {
      
debug("[END]");
      
digitalWrite(LED_GLB,LOW);
      
digitalWrite(LED_GRN,HIGH);

      if (
IR_Data.BytesReceived 0)
      {
          
// Letztes Byte ist Checksumme
          
uint8_t rec_check = *(bufptr-1); 
          
int check 0;
          for (
int i=0;i<(IR_Data.BytesReceived-1);i++)
                
// XOR Verknüpfung für Checksumme
                
check check IR_Data.rec_buffer[i];  
       
          
// Checksumme ok?
          
debug(" Check:"); debug(check,HEX);
          if (
rec_check == check)  {  
            
IR_valid TRUE;
            
debug(" CRC:OK");
          } else {
            
IR_valid FALSE;
            
debug(" CRC:ERROR!");
          }
          
// Checksumme abziehen    
          
IR_Data.BytesReceived -= 1
          
debug(" No:");  debug(IR_Data.BytesReceived,DEC); debugln("");
       }
       
IR_active FALSE;    
       
state 0;
    }

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  DCF77 Empfänger paq 19 912 23.07.2016 17:16
Letzter Beitrag: rkuehle
  Empfänger RF 433 peterfried 6 367 10.06.2016 23:01
Letzter Beitrag: hotsystems
  Wo kann ich hier noch Code spahren? (SPI-,Ethernet-,SD-,GSM-Library) avoid 4 382 05.06.2016 14:16
Letzter Beitrag: avoid
  AKtuelle Uhrzeit bekommen, RTC oder DFC-Empfänger Cray-1 34 15.548 11.02.2016 23:49
Letzter Beitrag: hotsystems
  DMX Empfänger BennIY 12 2.205 24.09.2015 19:51
Letzter Beitrag: BennIY
  C++ string Klasse in Sketch benutzen? HaWe 4 860 01.05.2015 14:48
Letzter Beitrag: HaWe
  Hilfe bei RC-Empfänger Signale auswerten und verarbeiten Pat12-6 7 1.677 19.03.2015 20:17
Letzter Beitrag: Eichner
Wink Bitte helft mir: RC Empfänger auslesen und an Motortreiber weitergeben. christian@schiltkamp.info 7 3.934 15.03.2015 17:54
Letzter Beitrag: Pat12-6
  RC-Empfänger auslesen und Motoren steuern Pat12-6 0 972 14.03.2015 10:29
Letzter Beitrag: Pat12-6
  Klasse in Klasse instanzieren Smidoino 7 1.188 25.02.2015 11:22
Letzter Beitrag: Thorsten Pferdekämper

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste