0

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:

  1. I send 7 inputs (from master) to the slave but only receives 6
  2. 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:;
}
sa_leinad
3,2182 gold badges23 silver badges51 bronze badges
asked Oct 16, 2018 at 17:56
1
  • Where is the Wire.onRequest ? Commented Oct 16, 2018 at 18:10

1 Answer 1

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())

answered Oct 16, 2018 at 18:12
4
  • Which coding sir ? Commented Oct 16, 2018 at 18:15
  • change while (1 < Wire.available()) to while (0 < Wire.available()) Commented 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 ? Commented Oct 16, 2018 at 18:48
  • replace Serial.print(c); with Serial.println(c); ln is line Commented Oct 16, 2018 at 18:50

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.