Plug'n' spela Neopixels
Inte du älskar dessa Adafruit Neopixel ringar? Jag har 12, 24 och de massiva 60 pixel ringarna, och fram till nu alla mina skisser har varit konfigureras för att köra med någon av dem, med storleken statiskt inställd på kompileringstid med en linje som
#define PIXLAR 24
Så om jag ändrar ringen för en annan storlek jag behöva kompilera om skissen och åter ladda upp den. Men vore det inte trevligt om skissen kan automatiskt avgöra ring storlek för sig själv, vilket gör det plug'n' spela! Bilderna visar var och en av 60 24 och 12 pixel ringar i sin tur drivs av samma omodifierade skissen.
Det finns flera möjliga sätt att göra det, alla förlitar sig på det faktum att när alla pixlar i en ring har fått deras RGB-data, eventuella överskott data faller ur DOUT anslutningen i slutet av kedjan för att göra det möjligt att daisy-kedjan ytterligare Neopixels om du vill. I princip sedan, kan du bara ansluta DOUT till en ingångsstift på Arduino och räkna hur många pixlar du har fyllda innan data börjar sippra ut ur andra änden.
Som alltid, det är lättare sagt än gjort, särskilt om du ställde dig begränsningen som du verkligen inte vill ändra standard Adafruit Neopixel bibliotek.
Min första tanke var att ansluta DOUT till ett avbrott stift på Arduino. Bibliotekets funktioner grejer data i Neopixels med avbryter inaktiveras, så avbrottet (om utlöste) skulle endast betjänas när fyllning hade klar. Men i princip kan du initiera successivt större ringar tills avbrottet inte skedde alls. Tyvärr har det normalt att instansieras i globala sammanhang att göra den åtkomlig från både setup() och loop(), medan det skulle behöva vara instansierad i setup() för att genomföra den nödvändiga logiken.
En bättre metod är att använda Counter/Timer 1 i counter läge för att räkna pulser från DOUT. Detta kräver att du ansluter DOUT till Pin 5, Counter/Timer 1 extern klocka pin. Varje pixel kräver 24 bitar data (företrädd av en kort puls för "0" eller en lång en för "1"), så allt du behöver göra är att skapa en instans av den största storleken på ringen, dela antalet pulser räknas av 24. Detta visar hur mycket mindre är ringen i bruket (om alls), jämfört med den största ringen. Därför kan du beräkna den faktiska ring storleken och spara den i en global variabel för användning där krävs. Det spelar ingen roll att det Adafruit biblioteket sedan kommer att skicka data till icke-existerande pixlar.