I have been working on my project but I get an error and I need some advice or correction.
I use I2C method to communicate between master and slave. I've got two questions:
- I send 7 inputs (from master) to the slave but only receives 6
- Will my coding make an output like this video
Master Code
// Master Code
#include <Wire.h>
byte nChar =0;
char input[7];
void setup () {
Serial.begin(9600);
Wire.begin();
}
void loop()
{
if (nChar < 7) {if (Serial.available()) { input[nChar++] = Serial.read();}}
else {
Wire.beginTransmission(1);
//a
Wire.write(input[0]);
Serial.print("Drawer : ");
Serial.println(input[0]);
//x
Wire.write(input[1]);
Serial.print("Output : ");
Serial.println(input[1]);
//00
Wire.write(input[2]);
Wire.write(input[3]);
Serial.print("Output : ");
Serial.print(input[2]);
Serial.println(input[3]);
//y
Wire.write(input[4]);
Serial.print("Output : ");
Serial.println(input[4]);
//00
Wire.write(input[5]);
Wire.write(input[6]);
Serial.print("Output : ");
Serial.print(input[5]);
Serial.println(input[6]);
delay(15);
while (Serial.available())
{
//Remove extra
Serial.read();
}
Wire.endTransmission();
nChar = 0;
}
}
Slave Code
#include <Wire.h>
byte ledPins[] = {12, 11, 10, 9, 8, 7, 6};
byte ledPins2[] = {12, 11, 10, 9, 8, 7, 6};
byte count;
byte nChar;
char c;
char input[8];
char data[30] = "";
int n;
#define nBits sizeof(ledPins)/sizeof(ledPins[0])
#define nBits sizeof(ledPins2)/sizeof(ledPins[0])
void setup()
{
Wire.begin(1);
Serial.begin(9600);
for (byte i = 0; i < nBits; i++) {
pinMode(ledPins[i], OUTPUT);
}
for (byte i = 0; i < nBits; i++) {
pinMode(ledPins2[i], OUTPUT);
}
Serial.begin(9600);
}
void loop()
{
if (nChar < 8) { //accumulate three characters
if (Serial.available()) {
c = Serial.read();
input[nChar++] = c;
}
}
else {
input[8] = 1; //atoi() expects string terminator
n = atoi(input); //convert the input characters to integer
dispBinary(n);
delay(100); //wait for any additional characters
while (Serial.available()) { //ignore them
c = Serial.read();
}
nChar = 1;
}
}
void receiveEvent(int howMany)
{
while (1 < Wire.available()) {
char c = Wire.read();
Serial.print(c);
}
}
void dispBinary(int n) //Vertical
{
if (n >= 0 && n <= 5) {
for (byte i = 0; i < nBits; i++) {
digitalWrite (ledPins[i], n & 1);
n /= 2;
}
}
}
void dispBinary2(int n) //Horizontal
{
if (n >= 0 && n <= 5) {
for (byte i = 0; i < nBits; i++) {
digitalWrite (ledPins2[i], n & 1);
n /= 2;
}
}
}
void b()
{
if (data[0] != 'a')
{
dispBinary(atoi("00"));
delay(100);
dispBinary2(atoi("00"));
delay(100);
goto fin;
}
if (data[1] = 'x')
{
char xdata[2] = {data[2], data[3]};//(data[2], data[3]);
dispBinary2(atoi(xdata));
delay(100);
}
if (data[4] = 'y')
{
char ydata[2] = {data[5], data[6]};//(data[5], data[6]);
dispBinary(atoi(ydata));
delay(100);
}
fin:;
}
-
Where is the Wire.onRequest ?Jot– Jot2018年10月16日 18:10:20 +00:00Commented Oct 16, 2018 at 18:10
1 Answer 1
Most coders would your while (1 < Wire.available()) {
write as while ( Wire.available() > 1) {
and read it "repeat while there is more the 1 byte available". but wait, why leave that one byte there? you want "repeat while there is no more byte available".
you need while (0 < Wire.available())
-
Which coding sir ?Muhammad Nazirul Na'im Maznan– Muhammad Nazirul Na'im Maznan2018年10月16日 18:15:44 +00:00Commented Oct 16, 2018 at 18:15
-
change
while (1 < Wire.available())
towhile (0 < Wire.available())
2018年10月16日 18:40:31 +00:00Commented Oct 16, 2018 at 18:40 -
Another question why it became on same line. Why not it become one line one output. I cant put image to share with you. How to do ?Muhammad Nazirul Na'im Maznan– Muhammad Nazirul Na'im Maznan2018年10月16日 18:48:02 +00:00Commented Oct 16, 2018 at 18:48
-
replace
Serial.print(c);
withSerial.println(c);
ln
is line2018年10月16日 18:50:42 +00:00Commented Oct 16, 2018 at 18:50