RC Positionslicht mit Arduino und Sbus

I3uLL3t

User
Hallo alle zusammen,
ich bin aktuell dabei ein "altes" Modell wieder auf zu bauen was so ziemlich jeder kennt. Die Robbe Charter ohne Querruder.
Dabei dachte ich mir sie hat es Verdient eine Beleuchtung zu bekommen und auch ein Cockpit, das ist aber hier nebensächlich.
ein einfaches Positionslicht zu kaufen war mir zu langweilig also habe ich mich ran gesetzt und habe mir selber was mit dem Arduino Programmiert.
Hat auch recht schnell gut funktioniert aber man könnte natürlich auch noch ein bisschen mit dem Sbus "spielen" :)
gesagt getan, dabei raus gekommen ist ein Positionslicht Modul mit bis zu 9 programmierbaren Modis.
in der ersten Version habe ich erstmal drei einprogrammiert und jedem steht frei noch mehr einzubauen und sie dann hoffentlich auch zu teilen.

In dem Video ist mein "scale" modus zu sehen.
https://youtu.be/B4tNHSUvj10

Der Aufbau ist recht simpel
Position_lights_Steckplatine.jpg

Hier ist der Code
Code:
// ScalePlaneLights GitHub https://github.com/Peschi90/ScalePlaneLights/
// started by Marcel Peschka  http://www.peschi.info

// This is version : 1.0 (03.Aug.2018)

//******************************************************************************************************************************************************* //
//                                                                                                                                                        //
//                                             Scale Plane Position Lights with Sbus communication                                                        //
//                                                                                                                                                        //
//******************************************************************************************************************************************************* //


#include <sbus.h>
#define SBUS_PIN 13   // D13
SBUS sbus;

//SBUS CHANNEL NUMBER
#define SBUSchannel_1 5               //CHANGE IT TO YOUR RC CHANNEL
#define SBUSchannel_2 9               //CHANGE IT TO YOUR RC CHANNEL

//SBUS SWITCH MODES                   //WHAT TYPE OF SWITCHES DO YOU USE AT THE SBUS CHANNELS?
#define SBUSswitchMode 2              // 1 = BOTH 2 WAY SWITCHES (HIGH LOW)
                                      // 2 = BOTH 3 WAY SWITCHES (HIG MID LOW)
                                      // 3 = FIRST 2 WAY SECOND 3 WAY (HIGH MID & HIGH MID LOW)
                                      // 4 = ONE 2 WAY SWITCH (HIGH LOW)
                                      // 5 = ONE 3 WAY SWITCH (HIGH MID LOW)

//KIND OF MODES
#define MODE1 mode_1();
#define MODE2 mode_2();
#define MODE3 mode_3();
#define MODE4 mode_4();
#define MODE5 mode_5();
#define MODE6 mode_6();
#define MODE7 mode_7();
#define MODE8 mode_8();
#define MODE9 mode_9();


//HERE YOU CAN DEFINE YOU OWN END POINTS FOR THE SBUS SIGNALS
#define range_SBUS_high_top 2100
#define range_SBUS_high_low 1700
#define range_SBUS_mid_top 1699
#define range_SBUS_mid_low 1300
#define range_SBUS_low_top 1299
#define range_SBUS_low_low  800

//LED PINS                            I TAKE THE PWM PINS FOR THAT TO DIM OR FADE THE LEDS IN DIFFERENT MODES
#define low_light 3
#define top_light 5
#define left_light 6
#define right_light 9
#define rudder_light 10

//DELAY TIMES
#define blinking_Time_off_top 1000    //OFF TIME FOR THE TOP LIGHT IN BLINKING MODES IN MILLI SECONDS
#define blinking_Time_on_top 50       //ON TIME FOR THE TOP LIGHT IN BLINKING MODES IN MILLI SECONDS
#define blinking_Time_off_low 1100    //OFF TIME FOR THE LOW LIGHT IN BLINKING MODES IN MILLI SECONDS
#define blinking_Time_on_low 50       //ON TIME FOR THE LOW LIGHT IN BLINKING MODES IN MILLI SECONDS
#define fadeing_Time_on 40            //FADING SPEED FOR EVERY INCREASE STEP
#define fadeing_Time_off 30           //FADING SPEED FOR EVERY DECREASE STEP
#define next_light_Mode_2 100         //SPEED FOR NEXT LED IN MODE 2 IF YOU DECREASE YOU HAVE AN FASTER RUNNING LIGHT IN MODE 2
#define blinking_Time_off_error 1000  //OFF TIME FOR BLINKING WHILE ERROR MODE IN MILLI SECONDS
#define blinking_Time_on_error  1000  //ON TIME FOR BLINKING WHILE ERROR MODE IN MILLI SECONDS

//VARIABLES FOR TIME MESUREMENT      NO CHANGES NEEDED
unsigned long timeMillis;
unsigned long lastMillis_top;
unsigned long lastMillis_low;
unsigned long lastMillis_fade;
unsigned long lastMillis_Mode_2;

//MODE 2 VARIABLES
int LED_order[5]={low_light,left_light,top_light,rudder_light,right_light};   //YOU CAN CHANGE THE ORDER OF THE RUNNING LIGHT MODE BE EDITING THE ARRAY
int order_count_on = 0;
int order_count_off = 0;

//BLINKING OFF OR ON VARIABLE       NO CHANGES NEEDED
int blinking_off_top = 0;
int blinking_off_low = 0;

//VARIABLES FOR FADEING
int fadeing = 0;
int fadeValueOn = 0;
int fadeValueOff = 255;  //HERE YOU CAN CHANGE THE FADING BRIGHTNESS 255 IS MAXIMUM

//SBUS CHANNEL VARIABLE TEMPORARY   NO CHANGES NEEDED
uint16_t channel_1;     
uint16_t channel_2;

//SBUS CHANNEL RESULT
uint16_t channel_1_result;
uint16_t channel_2_result;
int channel_1_count = 0;
int channel_2_count = 0;


void setup() {
Serial.begin(115200);
sbus.begin(SBUS_PIN, sbusBlocking); 
pinMode (low_light, OUTPUT);
pinMode (top_light, OUTPUT);
pinMode (left_light, OUTPUT);
pinMode (right_light, OUTPUT);
pinMode (rudder_light, OUTPUT);
}

void loop() {
   timeMillis = millis();
   if (!sbus.waitFrame()) {               //IF YOU HAVE NO CONNECTION TO THE SBUS ALL LIGHTS WILL BE OFF
     analogWrite(top_light, 0);
     analogWrite(low_light, 0);
     analogWrite(left_light, 0);
     analogWrite(right_light, 0);
     analogWrite(rudder_light, 0);  
    } else {
      SBUSread_filter_Channels();       //I READ THE SBUS CHANNELS 16 TIMES AND FILTER THE SIGNAL BECOUSE SOMETIMES I GOT AN IVALID VALUE
      if(SBUSswitchMode == 1){
        Switch2x2way();
      }else if(SBUSswitchMode == 2){
        Switch2x3way();
      }else if(SBUSswitchMode == 3){
        Switch1x2way1x3way();
      }else if(SBUSswitchMode == 4){
        Switch1x2way();
      }else if(SBUSswitchMode == 5){
        Switch1x3way();
      }else{
        errorMode();                    //IF NO SBUSswitchMode IS DETECTET/DEFINED THE LEDS GO IN ERROR MODE 
      } 
    }
}
//**************************************************************************************************************************************************************
//**************************************************************************************************************************************************************
//*******************************************************MODE DEFINITION PART START*****************************************************************************
//**************************************************************************************************************************************************************
//**************************************************************************************************************************************************************
//IF YOU WANT YOU CAN RENAME THE MODE (FUNCTION NAME) HERE, BUT AFTER THAT YOU MUST CHANGE THE NAME TOO AT THE kind of mode SECTION AT THE BEGINNING FROM THIS FILE
//_______________________________________________________________________________________________________________________________________________________
//__________________________________________________________________MODE1 START__________________________________________________________________________
//_______________________________________________________________________________________________________________________________________________________
//SCALE LIGHT BEHAVIOUR
void mode_1(){
  digitalWrite(left_light,HIGH);
  digitalWrite(right_light,HIGH);
  //TOP BLINKER
  if(blinking_off_top==0 && (timeMillis - lastMillis_top)>= blinking_Time_on_top){
    digitalWrite(top_light, LOW);
    lastMillis_top = millis();
    blinking_off_top = 1;
    
  }else if(blinking_off_top==1 && (timeMillis - lastMillis_top) >= blinking_Time_off_top){
    digitalWrite(top_light, HIGH);
    lastMillis_top = millis();
    blinking_off_top = 0;
  }
  //LOW BLINKER
  if(blinking_off_low==0 && (timeMillis - lastMillis_low)>= blinking_Time_on_low){
    digitalWrite(low_light, LOW);
    lastMillis_low = millis();
    blinking_off_low = 1;
    
  }else if(blinking_off_low==1 && (timeMillis - lastMillis_low) >= blinking_Time_off_low){
    digitalWrite(low_light, HIGH);
    lastMillis_low = millis();
    blinking_off_low = 0;
  }
  //FADING RUDDER LIGHT
  if(fadeing==1 && (timeMillis - lastMillis_fade)>= fadeing_Time_on){
    fadeValueOn +=5;
    lastMillis_fade = millis();
    analogWrite(rudder_light,fadeValueOn);
    if(fadeValueOn >= 255){fadeing = 0;fadeValueOn = 0;}
  }
  if(fadeing == 0 && (timeMillis - lastMillis_fade) >= fadeing_Time_off){
    fadeValueOff -=5;
    lastMillis_fade = millis();
    analogWrite(rudder_light,fadeValueOff);
    if(fadeValueOff <= 0){fadeing = 1;fadeValueOff = 255;}
  }
}
//_______________________________________________________________________________________________________________________________________________________
//__________________________________________________________________MODE1 END____________________________________________________________________________
//_______________________________________________________________________________________________________________________________________________________
//__________________________________________________________________MODE2 START__________________________________________________________________________
//_______________________________________________________________________________________________________________________________________________________
//RUNNING LIGHT MODE
void mode_2(){
  if((timeMillis - lastMillis_Mode_2)>= next_light_Mode_2 && order_count_on <= 4){
    analogWrite(LED_order[order_count_on],255);
    order_count_on++;
    lastMillis_Mode_2 = millis();
  }else if((timeMillis - lastMillis_Mode_2) >= next_light_Mode_2 && order_count_on == 5 && order_count_off <= 4){
    analogWrite(LED_order[order_count_off],0);
    order_count_off++;
    lastMillis_Mode_2 = millis();
  }else if (order_count_on == 5 && order_count_off == 5){
    order_count_on = 0;
    order_count_off = 0;
  }
}
//_______________________________________________________________________________________________________________________________________________________
//__________________________________________________________________MODE2 END____________________________________________________________________________
//_______________________________________________________________________________________________________________________________________________________
//__________________________________________________________________MODE3 START__________________________________________________________________________
//_______________________________________________________________________________________________________________________________________________________
void mode_3(){
    if(blinking_off_top==0 && (timeMillis - lastMillis_top)>= blinking_Time_on_top){
    digitalWrite(top_light, LOW);
    digitalWrite(low_light, LOW);
    digitalWrite(left_light, LOW);
    digitalWrite(right_light, LOW);
    digitalWrite(rudder_light, LOW);
    lastMillis_top = millis();
    blinking_off_top = 1;
    
  }else if(blinking_off_top==1 && (timeMillis - lastMillis_top) >= blinking_Time_on_top){
    digitalWrite(top_light, HIGH);
    digitalWrite(low_light, HIGH);
    digitalWrite(left_light, HIGH);
    digitalWrite(right_light, HIGH);
    digitalWrite(rudder_light, HIGH);
    lastMillis_top = millis();
    blinking_off_top = 0;
  }
}
//_______________________________________________________________________________________________________________________________________________________
//__________________________________________________________________MODE3 END____________________________________________________________________________
//_______________________________________________________________________________________________________________________________________________________
//__________________________________________________________________MODE4 START__________________________________________________________________________
//_______________________________________________________________________________________________________________________________________________________
void mode_4(){
}
//_______________________________________________________________________________________________________________________________________________________
//__________________________________________________________________MODE4 END____________________________________________________________________________
//_______________________________________________________________________________________________________________________________________________________
//__________________________________________________________________MODE5 START__________________________________________________________________________
//_______________________________________________________________________________________________________________________________________________________
void mode_5(){
}
//_______________________________________________________________________________________________________________________________________________________
//__________________________________________________________________MODE5 END____________________________________________________________________________
//_______________________________________________________________________________________________________________________________________________________
//__________________________________________________________________MODE6 START__________________________________________________________________________
//_______________________________________________________________________________________________________________________________________________________
void mode_6(){
}
//_______________________________________________________________________________________________________________________________________________________
//__________________________________________________________________MODE6 END____________________________________________________________________________
//_______________________________________________________________________________________________________________________________________________________
//__________________________________________________________________MODE7 START__________________________________________________________________________
//_______________________________________________________________________________________________________________________________________________________
void mode_7(){  
}
//_______________________________________________________________________________________________________________________________________________________
//__________________________________________________________________MODE7 END____________________________________________________________________________
//_______________________________________________________________________________________________________________________________________________________
//__________________________________________________________________MODE8 START__________________________________________________________________________
//_______________________________________________________________________________________________________________________________________________________
void mode_8(){
}
//_______________________________________________________________________________________________________________________________________________________
//__________________________________________________________________MODE8 END____________________________________________________________________________
//_______________________________________________________________________________________________________________________________________________________
//__________________________________________________________________MODE9 START__________________________________________________________________________
//_______________________________________________________________________________________________________________________________________________________
void mode_9(){
}
//_______________________________________________________________________________________________________________________________________________________
//__________________________________________________________________MODE9 END____________________________________________________________________________
//_______________________________________________________________________________________________________________________________________________________
void errorMode(){
    if(blinking_off_top==0 && (timeMillis - lastMillis_top)>= blinking_Time_on_error){
    digitalWrite(top_light, LOW);
    digitalWrite(low_light, LOW);
    digitalWrite(left_light, LOW);
    digitalWrite(right_light, LOW);
    digitalWrite(rudder_light, LOW);
    lastMillis_top = millis();
    blinking_off_top = 1;
    
  }else if(blinking_off_top==1 && (timeMillis - lastMillis_top) >= blinking_Time_off_error){
    digitalWrite(top_light, HIGH);
    digitalWrite(low_light, HIGH);
    digitalWrite(left_light, HIGH);
    digitalWrite(right_light, HIGH);
    digitalWrite(rudder_light, HIGH);
    lastMillis_top = millis();
    blinking_off_top = 0;
  }
}
//**************************************************************************************************************************************************************
//**************************************************************************************************************************************************************
//*******************************************************MODE DEFINITION PART END*******************************************************************************
//**************************************************************************************************************************************************************
//**************************************************************************************************************************************************************



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////NO CHANGES NEEDED////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////!!!!!!!!!!!!!!!!!////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//FILTERING THE SBUS CHANNELS OVER 16 READINGS BECOUSE OF SOME INTERRUPTS
void SBUSread_filter_Channels(){
    if(channel_1_count <= 15){
    channel_1 += sbus.getChannel(SBUSchannel_1);
    channel_1_count++;
    }else{
    channel_1_count = 0;
    channel_1_result = channel_1 / 16;
    channel_1 = 0;
    }
    if(channel_2_count <= 15){
    channel_2 += sbus.getChannel(SBUSchannel_2);
    channel_2_count++;
    }else{
    channel_2_count = 0;
    channel_2_result = channel_2 / 16;
    channel_2 = 0;
    }
}
void Switch2x2way(){
  if(channel_1_result <= range_SBUS_low_top && channel_1_result >= range_SBUS_low_low && channel_2_result <= range_SBUS_low_top && channel_2_result >= range_SBUS_low_low){
     MODE1
    }else if(channel_1_result <= range_SBUS_high_top && channel_1_result >= range_SBUS_high_low && channel_2_result <= range_SBUS_low_top && channel_2_result >= range_SBUS_low_low){
     MODE2
    }else if(channel_1_result <= range_SBUS_low_top && channel_1_result >= range_SBUS_low_low && channel_2_result <= range_SBUS_high_top && channel_2_result >= range_SBUS_high_low){
     MODE4
    }else if(channel_1_result <= range_SBUS_high_top && channel_1_result >= range_SBUS_high_low && channel_2_result <= range_SBUS_high_top && channel_2_result >= range_SBUS_high_low){
     MODE3
    }
}
void Switch2x3way(){
  if(channel_1_result <= range_SBUS_low_top && channel_1_result >= range_SBUS_low_low && channel_2_result <= range_SBUS_low_top && channel_2_result >= range_SBUS_low_low){
     MODE1
    }else if(channel_1_result <= range_SBUS_high_top && channel_1_result >= range_SBUS_high_low && channel_2_result <= range_SBUS_low_top && channel_2_result >= range_SBUS_low_low){
     MODE3 
    }else if(channel_1_result <= range_SBUS_low_top && channel_1_result >= range_SBUS_low_low && channel_2_result <= range_SBUS_high_top && channel_2_result >= range_SBUS_high_low){
     MODE7
    }else if(channel_1_result <= range_SBUS_high_top && channel_1_result >= range_SBUS_high_low && channel_2_result <= range_SBUS_high_top && channel_2_result >= range_SBUS_high_low){
     MODE5
    }else if(channel_1_result <= range_SBUS_mid_top && channel_1_result >= range_SBUS_mid_low && channel_2_result <= range_SBUS_low_top && channel_2_result >= range_SBUS_low_low){
     MODE2
    }else if(channel_1_result <= range_SBUS_low_top && channel_1_result >= range_SBUS_low_low && channel_2_result <= range_SBUS_mid_top && channel_2_result >= range_SBUS_mid_low){
     MODE8
    }else if(channel_1_result <= range_SBUS_mid_top && channel_1_result >= range_SBUS_mid_low && channel_2_result <= range_SBUS_mid_top && channel_2_result >= range_SBUS_mid_low){
     MODE9
    }else if(channel_1_result <= range_SBUS_high_top && channel_1_result >= range_SBUS_high_low && channel_2_result <= range_SBUS_mid_top && channel_2_result >= range_SBUS_mid_low){
     MODE4
    }else if(channel_1_result <= range_SBUS_mid_top && channel_1_result >= range_SBUS_mid_low && channel_2_result <= range_SBUS_high_top && channel_2_result >= range_SBUS_high_low){
     MODE6
    }
}
void Switch1x2way1x3way(){
  if(channel_1_result <= range_SBUS_low_top && channel_1_result >= range_SBUS_low_low && channel_2_result <= range_SBUS_low_top && channel_2_result >= range_SBUS_low_low){
     MODE1
    }else if(channel_1_result <= range_SBUS_high_top && channel_1_result >= range_SBUS_high_low && channel_2_result <= range_SBUS_low_top && channel_2_result >= range_SBUS_low_low){
     MODE2 
    }else if(channel_1_result <= range_SBUS_low_top && channel_1_result >= range_SBUS_low_low && channel_2_result <= range_SBUS_high_top && channel_2_result >= range_SBUS_high_low){
     MODE5
    }else if(channel_1_result <= range_SBUS_high_top && channel_1_result >= range_SBUS_high_low && channel_2_result <= range_SBUS_high_top && channel_2_result >= range_SBUS_high_low){
     MODE4
    }else if(channel_1_result <= range_SBUS_low_top && channel_1_result >= range_SBUS_low_low && channel_2_result <= range_SBUS_mid_top && channel_2_result >= range_SBUS_mid_low){
     MODE6
    }else if(channel_1_result <= range_SBUS_high_top && channel_1_result >= range_SBUS_high_low && channel_2_result <= range_SBUS_mid_top && channel_2_result >= range_SBUS_mid_low){
     MODE3
    }
}
void Switch1x2way(){
  if(channel_1_result <= range_SBUS_low_top && channel_1_result >= range_SBUS_low_low){
     MODE1
    }else if(channel_1_result <= range_SBUS_high_top && channel_1_result >= range_SBUS_high_low){
     MODE2 
    }
}
void Switch1x3way(){
  if(channel_1_result <= range_SBUS_low_top && channel_1_result >= range_SBUS_low_low){
     MODE1
    }else if(channel_1_result <= range_SBUS_mid_top && channel_1_result >= range_SBUS_mid_low){
     MODE2 
    }else if(channel_1_result <= range_SBUS_high_top && channel_1_result >= range_SBUS_high_low){
     MODE3 
    }
}

Ich möchte euch aber darum bitten die Version immer von GitHub zu nehmen, da ich wahrscheinlich immer mal wieder Updates machen werde.
https://github.com/Peschi90/ScalePlaneLights/
Dort steht auch welche Libary ihr noch benötigt.

Ein paar mehr Informationen habe ich auf meiner Webseite noch zusammen gefasst. Ich hoffe der Verweis ist in ordnung.
http://peschi.info/2018/08/03/rc-flugzeug-positionslichter-mit-arduino/


Ich hoffe auf ein paar Leute die es nachbauen und mir Tipps zum Code geben :)
 
Diese

if(SBUSswitchMode == 1){
Switch2x2way();
}else if(SBUSswitchMode == 2){

würde ich vielleicht eher als

switch(SBUSswitchMode) {
case 1: Switch2x2way(); break;
case 2: Switch2x3way(); break;
...

usw realisieren.

Dann setzt Du an einige Stellen alle Lichter auf einen Wert:
====
digitalWrite(top_light, LOW);
digitalWrite(low_light, LOW);
digitalWrite(left_light, LOW);
digitalWrite(right_light, LOW);
digitalWrite(rudder_light, LOW);
====

Schreib Dir doch ne Funktion
void setAllLights( uint8_t value) {
digitalWrite(top_light, value);
digitalWrite(low_light, value);
digitalWrite(left_light, value);
digitalWrite(right_light, value);
digitalWrite(rudder_light, value);
}

und ruf dann einfach setAllLights(LOW); auf?

Evtl. könnte man die Pins auch einfach in ein Array schreiben, aber dann wirds vielleicht zu kompliziert...
 

I3uLL3t

User
Hi,
erstmal danke für deine Tipps!
da tauchen bei mir natürlich dann die fragen auf warum? was für ein vorteil hat die switch Case Geschichte? ich habe mich mit der mal zu Batch Zeiten beschäftigt aber nun schon lange nicht mehr :D
Wäre super wenn du mir ein bisschen erläutern könntest warum du das machen würdest.

Gruß Marcel
 
Ich könnte jetzt einfach sagen, dass es kürzer ist, aber eigentlich find ich es primär besser lesbar.

Ein anderes Argument geht dann aber so, dass der Compiler einfach besseren Code erzeugen kann:

http://lazarenko.me/switch/

Der Hauptgrund ist wohl einfach, dass bei einem switch-case der Compiler weiss, dass er immer ein und dieselbe Variable vergleichen muss. Bei so einer Kette von if-else kann ja in jedem if etwas stehen, was mit dem vorherigen if gar nix zu tun hat:

if( funktion1(5)==22) {
machWas();
} else if(funktion2(7)==33) {
machWasAnderes();
}

D.h. der Compiler muss bei Deinem Code erstmal mitbekommen, dass Du eigentlich immer die gleiche Variable auf einen Wert testest. Ob er das hinbekommt, hängt davon ab, wieviel Code er sich für eine Optimierung betrachtet.
Bei einem switch lieferst Du ihm die Information dass es um ein und dieselbe Variable geht, aber sofort mit dem Konstrukt mit, so dass er besser optimieren kann.

Aber wie schon gesagt: bei Deinem Code find ichs einfach besser lesbar. Das wäre für mich der Hauptgrund, es zu ändern.

Evtl. kommst Du später an Grenzen bzgl. der Codegrösse, aber bei nem Atmega 328 und Deinem bisherigen Code wird das erstmal kein Thema sein. Aber evtl. würde ja bei wenig Code auch ein Attiny reichen? (Der ist kleiner und billiger.)
 

I3uLL3t

User
Danke Für die Beschreibung, das erscheint mir logisch!!
Ich werde das in der nächsten Revision mal umsetzen.

Ja ein Attiny ist zwar kleiner allerdings habe ich mich mit denen nie beschäftigt und für mein aktuelles Projekt habe ich null Platz Probleme.
Da könnte ich theoretisch auch nen UNO einbauen. :D
 

I3uLL3t

User
Ich bestelle mir die Nanos und minis immer ausm Ausland.
Glaube die nanos kommen im Zehnerpack für 11€ der Mini ist ein bisschen teurer aber nicht viel.
Versand ist ja mittlerweile auch echt fix bei denen.

Den atiny verliere ich nur im Flugzeug. :D
 
Ja, so mach ich das meist auch. Wobei ich jetzt öfters auch mal einen stm32f103 dazu leg, weil der vom Preis/Leistungsverhältnis her einfach nochmal besser ist. Zumindest wenn man mehr Rechenleistung braucht.
 
Ansicht hell / dunkel umschalten
Oben Unten