Передача кода цвета для RGB светодиода через NFR24L01
- Войдите на сайт для отправки комментариев
Чт, 21/03/2013 - 22:42
Всем привет!
Использую 2 arduino с NFR24l01 для управления удалённым RGB светодиодом (выбор цвета). Связь между ними есть, всё работает, код цвета передаётся.
Передаю так:
Mirf.setTADDR((byte *)"serv1"); Mirf.send((uint8_t *)"c9b2d8");
где c9b2d8 сам цвет.
На приёмной стороне принимаю так:
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#define MAX_BUFF 32 //Буфер приёма-передачи
unsigned long color;
unsigned int r;
unsigned int g;
unsigned int b;
void setup(){
Serial.begin(9600);
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
Mirf.setRADDR((byte *)"serv1"); // задаём имя устройства
Mirf.payload = MAX_BUFF; //Здесь задаём буфер
Mirf.channel = 10;
Mirf.config();
}
void loop()
{
char data[Mirf.payload];
if(!Mirf.isSending() && Mirf.dataReady())
{
Mirf.getData((uint8_t *)data);
// Serial.println(data);
setColor(data);
}
}
void setColor(char* value)
{ // Convert Char* to Long
color = atol(value);
r = color >> 16 & 0xFF;
g = color >> 8 & 0xFF;
b = color >> 0 & 0xFF;
analogWrite(3, r); //red
analogWrite(5, g); //green
analogWrite(6, b); //blue
}
Цвет передаётся но не разбивается на составляющие. Что делаю не так?
Судя по вашим словам и закомечненной строчке 27 - передача строки - у вас происходит. А отсюда следует что передатчик вообще непричем и тему нужно было назвать как-то типа "парсинг строки в unsigned long".
Отложите пока ваш скетч в сторону. Сделайте отдельный тестовый. В котором будет только вызов setColor("c9b2d8"), а сделайте Serial.print-ты вашем r,g,b - убедитесь что парсинг у вас правильно идет.
Сильно подозреваю что atol просто не поняла что у вас hex значение. Глянте в доку, може там что-то типа "0xc9b2d8" требуется и вторым параметром передать вид ожидаемого числа. Просто подумайте сами, вот как можно сказать какое значение у числа "111111" если мы не знаем десятчиное, двоичное, или шестнадцатеричное это число. Даже человек не сможет определить, не то что функция ;)
P.S. На крайний случае еще sscanf() есть.
Так "не разбивается на составляющие" или "разбивается неправильно"?
Или
http://www.cplusplus.com/reference/cstdlib/strtol/
Примерно так
strtol ("4A3D",NULL,16);Но лень самому пробовать :)
Заменил на
и всё работает. Спасибо!!!