No post anterior mostrei como fazer o primeiro programa na placa Particle Photon. Neste post iremos aprender como alternar ciclicamente pelas cores do arcoíris usando o LED RGB embutido na Particle Photon. Esse LED é usando pela Photon para indicar o estado do sistema e não possui nenhum método público na API para que sua cor seja alterada via código. No entanto, a ferramenta linha de comando particle possui uma opção chamada nyan que faz com que a Photon alterne ciclicamente pelas cores do arcoíris.
Caso você queira testar, execute o seguinte comando:
particle cloud nyan
Esse comando indica que, apesar de não haver método publico na API, ainda assim podemos mudar a cor do LED RGB via código. No arquivo system_cloud_internal.cpp do código do firmware da Photon, podemos encontrar o método LED_Signaling_Override, o qual é chamado durante a execução do comando nyan.
O código abaixo mostra como esse método pode ser usado em nossos próprios programas. O programa lê o estado de um botão que, quando pressionado, fará com que a Photon inicie a sequência de cores do arcoíris. Você pode baixar o código completo no Github através do seguinte link: Particle Photon vomitando arcoíris
// Conecte o botão ao pino D2 de sua Photon.
int buttonPin = D2;
int buttonState;
unsigned long ledSignalingCounter;
unsigned long now;
boolean nyan;
// Valores para as cores do arcoíris em RGB.
// VIBGYOR = Violeta Indigo Azul Verde Amarelo Laranja Vermelho
const uint32_t VIBGYOR_Colors[] = {
0xEE82EE, 0x4B0082, 0x0000FF, 0x00FF00, 0xFFFF00, 0xFFA500, 0xFF0000
};
const int VIBGYOR_Size = sizeof (VIBGYOR_Colors) / sizeof (uint32_t);
int VIBGYOR_Index;
void setup() {
pinMode(buttonPin, INPUT);
}
// Código copiado de system/src/system_cloud_internal.cpp (firmware da Photon)
// O arquivo pode ser encontrado em:
// https://github.com/spark/firmware/blob/d2b55ee9a151c4cbc63ede84ec2a89bbedf3c69e/system/src/system_cloud_internal.cpp
/* This function MUST NOT BlOCK!
* It will be executed every 1ms if LED_Signaling_Start() is called
* and stopped as soon as LED_Signaling_Stop() is called */
void LED_Signaling_Override(void) {
LED_SetSignalingColor(VIBGYOR_Colors[VIBGYOR_Index]);
LED_On(LED_RGB);
++VIBGYOR_Index;
if (VIBGYOR_Index >= VIBGYOR_Size) {
VIBGYOR_Index = 0;
}
}
void setNyanMode(int _nyan) {
// Retorna caso haja alguma mudança.
if(nyan == _nyan) {
return;
}
nyan = _nyan;
if(nyan == true) {
// Permite que o usuário altere manualmente a cor do LED RGB.
LED_Signaling_Start();
ledSignalingCounter = now;
} else {
// Retorna para o estado padrão do LED RGB.
LED_Signaling_Stop();
}
}
void loop() {
now = millis();
buttonState = digitalRead(buttonPin);
// Enquanto o botão estiver pressionado, executa a sequencia de cores do arcoíris
if(buttonState == HIGH) {
setNyanMode(true);
} else {
setNyanMode(false);
}
if(nyan) {
// Enquanto o bootão estiver pressionado, atualiza a cor do LED RGB a cada 100ms
if(now - ledSignalingCounter >= 100) {
LED_Signaling_Override();
ledSignalingCounter = now;
}
}



