// // This code is in the public domain. // // License: CC0 // // Note: // For Arduino Nano clones, some use a CH340 USB chipset // which causes problems when trying to upload sketches. // The solution is to select the 'Nano' board type and then // select the 'ATmega328P (Old Bootloader)' option to program. // // See: // https://arduino.stackexchange.com/questions/51729/ch340-nano-avrdude-stk500-getsync-not-in-sync-resp-0xa4 // https://arduino.stackexchange.com/questions/804/arduino-nano-uploading-gives-error-avrdude-stk500-recv-programmer-is-not-re // #include #define MSG_BUF_MAX 128 #define ARDWORKER_I2C_ADDRESS 0x08 char _tbuf[MSG_BUF_MAX]; int i2c_msg_buf_n = 0, i2c_msg_buf_rdy = 0; char i2c_msg_buf[MSG_BUF_MAX]; int serial_buf_s=0, serial_buf_n=0; char serial_buf[MSG_BUF_MAX]; void setup() { i2c_msg_buf_rdy = 0; i2c_msg_buf[0] = '\0'; i2c_msg_buf_n = 0; serial_buf_s=0; serial_buf_n=0; serial_buf[0] = '\0'; Wire.begin(ARDWORKER_I2C_ADDRESS); Wire.onReceive(receive_i2c_data); Wire.onRequest(send_i2c_data); Serial.begin(115200); } void loop() { int i, _b, _cur; int _ser_print_rdy = 0; noInterrupts(); if (Serial.available()) { _b = Serial.read(); if (_b >= 0) { // Add to our circular serial_buf for later tranport // through to the i2c line. // if (serial_buf_n < MSG_BUF_MAX) { _cur = (serial_buf_s + serial_buf_n) % MSG_BUF_MAX; serial_buf[_cur] = (char)_b; serial_buf_n++; } } } interrupts(); noInterrupts(); if (i2c_msg_buf_rdy) { for (i=0; i 0) { res = Wire.write((char)serial_buf[serial_buf_s]); serial_buf_n--; serial_buf_s++; serial_buf_s %= MSG_BUF_MAX; } } void receive_i2c_data(int howMany) { char c; while ( Wire.available()) { c = Wire.read(); i2c_msg_buf[i2c_msg_buf_n++] = c; if (i2c_msg_buf_n >= MSG_BUF_MAX) { i2c_msg_buf_n = MSG_BUF_MAX-1; } if ((c == '\n') || (c == '\r')) { i2c_msg_buf[i2c_msg_buf_n] = '\0'; // Our messages are terminated by '\n' and '\r'. // Once a message is received, shuttle it to the // serial line. // i2c_msg_buf_rdy=1; } } }