elektronek

Jarda Sládek - WS2812 Bluetoth

Nov 22nd, 2020
688
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <Adafruit_NeoPixel.h> // naimportování knihoven
  2. #include <SoftwareSerial.h>    // softwareserial knihovna
  3. #ifdef __AVR__
  4. #include <avr/power.h>
  5. #endif
  6. #define PIN 6       // Pin na WS pasek ledek
  7. #define LEDKA 13    // Ledka ON OFF
  8. #define LEDCNT 8    // Pocet ledek na pasku
  9. #define RX 2                 // Pin spojený s RX u Bluetooth modulu
  10. #define TX 3                 // Pin spojený s TX                                        
  11. #define SVETLOST 60     // Svetlost pasku 0 - 255
  12. //#define DEBUG 1   // Zakomentovano - vypnuty serial debug
  13.  
  14. Adafruit_NeoPixel strip = Adafruit_NeoPixel(LEDCNT, PIN , NEO_GRB + NEO_KHZ800); // init pasku
  15. SoftwareSerial BT(RX,TX);    // port softwareserial na pinech (2RX 3TX)
  16. String RGB = "0.0.0)";       // řetězec příjímající data z Bluetooth
  17. String RGB_Previous = "255.255.255)"; //řetězec předposledních dat z BT
  18. String ON = "ON";     // zapni  
  19. String OFF = "OFF";   //vypni
  20. boolean RGB_Completed = false;// ověření přijímaných dat
  21.  
  22. void setup() {
  23.   pinMode(LEDKA, OUTPUT);
  24.   #if defined (__AVR_ATtiny85__)
  25.   if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  26.   #endif
  27.   strip.begin(); // start pásku
  28.   strip.setBrightness(SVETLOST);
  29.   BT.begin(9600);  // start portu pro BT na 9600
  30.   RGB.reserve(30);
  31.   #ifdef DEBUG
  32.   Serial.begin(9600); // start sériového portu na 9600
  33.   #endif
  34.   Light_RGB_LED();
  35. }
  36.  
  37. void loop() {
  38.   while(BT.available())
  39.   {   //pokud je BT přijal data
  40.     char ReadChar = (char)BT.read();   // uloží se do ReadChar
  41.     if(ReadChar == ')')
  42.     { // když řetězec obsahuje ")"
  43.       RGB_Completed = true; // byl přenos dat uspěšný
  44.     }
  45.     else
  46.     {                  // pokud ne načte se zpět poslední hodnota  
  47.        RGB += ReadChar;
  48.     }
  49.   }
  50.  
  51.   if(RGB_Completed) //vypíše hodnotu RGB
  52.   {              
  53.     #ifdef DEBUG
  54.     Serial.print("RGB:");
  55.     Serial.print(RGB);
  56.     Serial.print("     PreRGB:");
  57.     Serial.println(RGB_Previous);
  58.     #endif
  59.     if(RGB==ON)
  60.     {                         // zapni
  61.       digitalWrite(LEDKA,HIGH);  // Rozsvit LED13
  62.       RGB = RGB_Previous;     // Nahod predchozi stav
  63.       Light_RGB_LED();        // Preneseme na pasek
  64.     }
  65.     else
  66.     if(RGB==OFF)
  67.     {                         // vypni
  68.       digitalWrite(LEDKA,LOW);   // Zhasni LED13
  69.       RGB = "0.0.0)";         // Vynulujeme
  70.       Light_RGB_LED();        // Preneseme na pasek
  71.     }
  72.     else
  73.     {
  74.       Light_RGB_LED();        // Preneseme na pasek
  75.       RGB_Previous = RGB;     // Ulozime predchozi stav
  76.     }
  77.     RGB = "";           // reset proměnné pro příjem dat
  78.     RGB_Completed = false;    
  79.   }    
  80. }
  81. //konec loopu
  82.  
  83. void Light_RGB_LED(){         // dekódování přijatých dat
  84.   if(RGB.length()>4 && RGB.length()<11) // omezení čtení v rozsahu min a max délky správně načtených dat
  85.   {
  86.     //RGB_Previous=RGB;
  87.     int SP1 = RGB.indexOf('.');          //uložení délky indexu pro hodnotu
  88.     int SP2 = RGB.indexOf('.', SP1+1);               //(SP1).(SP2).(SP3)  
  89.     int SP3 = RGB.indexOf('.', SP2+1);   // když je RGB 255.  45 . 3  tak SP1=3 SP2=2 a SP3=1
  90.     String R = RGB.substring(0, SP1);          // převedení na jednotlivé hodnoty RGB
  91.     String G = RGB.substring(SP1+1, SP2);      
  92.     String B = RGB.substring(SP2+1, SP3);
  93.     #ifdef DEBUG
  94.     Serial.print("R=");                // vypíše samostatné hodnoty v  RGB
  95.     Serial.println( constrain(R.toInt(),0,255));
  96.     Serial.print("G=");
  97.     Serial.println(constrain(G.toInt(),0,255));
  98.     Serial.print("B=");
  99.     Serial.println( constrain(B.toInt(),0,255));
  100.     #endif
  101.     for(int i=0;i<8;i++)              // for cyklus pro poslání dat do pásku
  102.     {                                 // máme 16 diod takže i=16
  103.       strip.setPixelColor(i,R.toInt(),G.toInt(),B.toInt());
  104.     }
  105.     strip.show();// inicializace pásku po které začne svítit
  106.   }
  107. }
RAW Paste Data