Hi,
I have written some code that works for transmitting data with wireless on 433 Mhz modules. The problem is it only works around 50 to 75 percent of the time and sometime has large gaps before it updates. I am hoping to get some clues as to how to hook up the system better and maybe upgrade the code.
The transmitter works fairly well, though I am sure it could be better. Basically you enter a byte of data, an integer between 0 and 255 in the sendData() function. In the second tab of the transmitter the number is converted to an array of true or false. This array is used to send the data.
/*James 9/22/2014
new attempt to send data instead of pulse widths over
single channel transmitter receiver module*/
//pins
int dataLine = 7;
//global vars
byte data; //0-255
boolean signal[8];
byte conversion[8] = {128,64,32,16,8,4,2,1};
int signalTime = 1000;// in Micro s
void setup()
{
pinMode(dataLine, OUTPUT);
//Serial.begin(9600);
}
void loop()
{
//convertData(125);
//sendData(255);
for(int i=0;i<10;i++)
{
sendData(250);
delay(100);
}
for(int i=0;i<10;i++)
{
sendData(15);
delay(100);
}
for(int i=0;i<10;i++)
{
sendData(55);
delay(100);
}
for(int i=0;i<10;i++)
{
sendData(0);
delay(100);
}
for(int i=0;i<10;i++)
{
sendData(150);
delay(100);
}
}
To catch the receiver a pulse of signalTime = 1ms is sent. This is followed by a 1ms low signal followed by the data. (This is the second tab for the transmitter)
void convertData(byte sending)
{
int holder;
/*1,2,4,8,16,32,64,128*/
//8th bit
/*if(sending / 128 > 0)//anything less than 128 should come out as zero
{
signal[7] = true;
holder = sending - 128;
}
else
{
signal[7] = false;
holder = sending;
}
*///...
holder = sending;
//Serial.println(holder);
for(int i = 0; i<8;i++)
{//Serial.println(i);
if( holder - conversion[i] >= 0)
{
signal[i] = true;
holder = holder - conversion[i];
}
else
{
signal[i] = false;
}
}
}//how could I have done this with less code?function or for loop
void sendData (byte sending)
{
convertData(sending);
digitalWrite(dataLine, HIGH);
delayMicroseconds(signalTime);
digitalWrite(dataLine, LOW);
delayMicroseconds(signalTime);
for ( int i=0; i< 8; i++)
{
if(signal[i] == true)
{
digitalWrite(dataLine, HIGH);
delayMicroseconds(signalTime);
}
else
{
digitalWrite(dataLine, LOW);
delayMicroseconds(signalTime);
}
}
digitalWrite(dataLine, LOW);
}
The receiver works in a similar way but opposite. It puts the data into an array then converts it to an number between 0 and 255.
/*basic data reciever for one byte data
James
9/23/2014*/
//pins
int dataIn = 2;//busa d1
//global variables
byte data;
byte conversion[8] = {128,64,32,16,8,4,2,1};
boolean signal[8];
int signalTime = 1000;//us
void setup()
{
pinMode(dataIn, INPUT);
Serial.begin(9600);
}
void loop()
{
receiveData();
data = convertData();
Serial.print("got ");
Serial.println(data);
delay(10);
}
The second tab for the receiver that has the functions.
void receiveData()
{
/*for (int i = 0; i<8; i++)//reset array
{
signal[i] = false;
}*/
long length = pulseIn(dataIn, HIGH, 1000000);
Serial.print("length = ");
Serial.println(length);
delayMicroseconds( signalTime/2);
int check = digitalRead(dataIn);
Serial.println(check);
delayMicroseconds(signalTime);
if(length > signalTime - 100 && check == LOW/*&& length < signalTime + 100*/)
{
for(int i = 0; i < 8; i++)
{
//Serial.print("dataIn ");
//Serial.println(digitalRead(dataIn));
if (digitalRead(dataIn) == HIGH)
{
signal[i] = true;
}
else
{
signal[i] = false;
}
//Serial.print("signal ");
//Serial.println(signal[i]);
delayMicroseconds(signalTime);
}
}
}
byte convertData()
{
byte dataToReturn = 0;
/*for(int i = 7; i >= 0 ; i-- )
{
byte added = 1;
if(signal[i] == true)
{
for(;i > 0; i--)
{
dataToReturn = 2 * added + dataToReturn;
added = 2* added;
}
}
}*/
/*if(signal[0] == true)
dataToReturn = dataToReturn +1;*/
for(int i = 0; i<8; i++)
{
if(signal[i] == true)
{
dataToReturn = dataToReturn + conversion[i];
}
}
return dataToReturn;
}
As far as hardware goes I have found that if I use a capacitor between signal and ground I get better results. However I do not know what size of capacitor to use and am guessing as far as that goes. I plan to use this cod to control a Remote control car.