- Primeiro programa na Particle Photon
- Arcoíris com a Particle Photon
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:
1 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
// 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; } } |