Передача кода цвета для RGB светодиода через NFR24L01

maloicds
maloicds аватар
Offline
Зарегистрирован: 21.03.2013

Всем привет!

 Использую 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
}

Цвет передаётся но не разбивается на составляющие. Что делаю не так?

leshak
Offline
Зарегистрирован: 29.09.2011

Судя по вашим словам и закомечненной строчке 27 - передача строки - у вас происходит. А отсюда следует что передатчик вообще непричем и тему нужно было назвать как-то типа "парсинг строки в unsigned long".

Отложите пока ваш скетч в сторону. Сделайте отдельный тестовый. В котором будет только вызов setColor("c9b2d8"), а сделайте Serial.print-ты вашем r,g,b - убедитесь что парсинг у вас правильно идет. 

Сильно подозреваю что atol просто не поняла что у вас hex значение. Глянте в доку, може там что-то типа "0xc9b2d8" требуется и вторым параметром передать вид ожидаемого числа. Просто подумайте сами, вот как можно сказать какое значение у числа "111111" если мы не знаем десятчиное, двоичное, или шестнадцатеричное это число. Даже человек не сможет определить, не то что функция ;)

P.S. На крайний случае еще sscanf() есть.

step962
Offline
Зарегистрирован: 23.05.2011

Так "не разбивается на составляющие" или "разбивается неправильно"?

leshak
Offline
Зарегистрирован: 29.09.2011

Или

http://www.cplusplus.com/reference/cstdlib/strtol/

Примерно так

strtol ("4A3D",NULL,16);

Но лень самому пробовать :)

 

maloicds
maloicds аватар
Offline
Зарегистрирован: 21.03.2013

Заменил на 



   color= strtol (value,NULL,16);

и всё работает. Спасибо!!!