I2C
Podem utilitzar un arduino configurat com I2C slave com a perifèric a mida
Un ESP8266 utilitza un arduino UNO per controlar uns leds i llegir uns polsadors i una entrada analògica
/* aug17a
* Arduino I2C slave
*/
#include <Wire.h>
#define I2CADDR 2
byte ordre = 0;
const int ledout1 = 8;
const int ledout2 = 9;
const int ledout3 = 10;
const int ledout4 = 11;
const int ledout5 = 12;
const int ledout6 = 13;
const int swtin1 = 3;
const int swtin2 = 4;
const int swtin3 = 5;
const int swtin4 = 6;
const int swtgnd = 7;
const int analin1 = A0;
int ledout[6];
int swtin[4];
int analin;
void setup() {
pinMode(ledout1,OUTPUT);
pinMode(ledout2,OUTPUT);
pinMode(ledout3,OUTPUT);
pinMode(ledout4,OUTPUT);
pinMode(ledout5,OUTPUT);
pinMode(ledout6,OUTPUT);
pinMode(swtin1,INPUT_PULLUP);
pinMode(swtin2,INPUT_PULLUP);
pinMode(swtin3,INPUT_PULLUP);
pinMode(swtin4,INPUT_PULLUP);
pinMode(swtgnd,OUTPUT);
digitalWrite(swtgnd,LOW);
Wire.begin(I2CADDR);
Wire.onReceive(escolta);
Wire.onRequest(respon);
}
void loop() {
if (ledout[0]==1) {
digitalWrite(ledout1,HIGH);
}
else {
digitalWrite(ledout1,LOW);
}
if (ledout[1]==1) {
digitalWrite(ledout2,HIGH);
}
else {
digitalWrite(ledout2,LOW);
}
if (ledout[2]==1) {
digitalWrite(ledout3,HIGH);
}
else {
digitalWrite(ledout3,LOW);
}
if (ledout[3]==1) {
digitalWrite(ledout4,HIGH);
}
else {
digitalWrite(ledout4,LOW);
}
if (ledout[4]==1) {
digitalWrite(ledout5,HIGH);
}
else {
digitalWrite(ledout5,LOW);
}
if (ledout[5]==1) {
digitalWrite(ledout6,HIGH);
}
else {
digitalWrite(ledout6,LOW);
}
if (digitalRead(swtin1)==1) {
swtin[0]=1;
}
else {
swtin[0]=0;
}
if (digitalRead(swtin2)==1) {
swtin[1]=1;
}
else {
swtin[1]=0;
}
if (digitalRead(swtin3)==1) {
swtin[2]=1;
}
else {
swtin[2]=0;
}
if (digitalRead(swtin4)==1) {
swtin[3]=1;
}
else {
swtin[3]=0;
}
analin=analogRead(analin1);
}
void escolta(int ordrelen) {
ordre = Wire.read();
switch(ordre) {
case 16:
ledout[0]=1;
break;
case 17:
ledout[1]=1;
break;
case 18:
ledout[2]=1;
break;
case 19:
ledout[3]=1;
break;
case 20:
ledout[4]=1;
break;
case 21:
ledout[5]=1;
break;
case 24:
ledout[0]=0;
break;
case 25:
ledout[1]=0;
break;
case 26:
ledout[2]=0;
break;
case 27:
ledout[3]=0;
break;
case 28:
ledout[4]=0;
break;
case 29:
ledout[5]=0;
break;
}
}
void respon() {
int resposta;
switch(ordre) {
case 0:
resposta = -1;
break;
case 1:
resposta = analin;
break;
case 4:
resposta = swtin[0];
break;
case 5:
resposta = swtin[1];
break;
case 6:
resposta = swtin[2];
break;
case 7:
resposta = swtin[3];
break;
case 16:
case 17:
case 18:
case 19:
case 20:
case 21:
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
resposta = 0;
break;
default:
resposta = -1;
break;
}
byte buffer[2];
buffer[0]=resposta >> 8;
buffer[1]=resposta & 0xff;
Wire.write(buffer,2);
ordre=0;
}
/* aug17b
* Arduino I2C slave
* codi al master ESP8266 NodeMcu 1.0
*/
#include <Wire.h>
#define I2CADDR 2
int resposta;
void setup() {
Serial.begin(115200);
Wire.begin();
}
void loop() {
Wire.beginTransmission(I2CADDR);
Wire.write(16);
Wire.endTransmission();
delay(100);
Wire.beginTransmission(I2CADDR);
Wire.write(24);
Wire.endTransmission();
Wire.beginTransmission(I2CADDR);
Wire.write(17);
Wire.endTransmission();
delay(100);
Wire.beginTransmission(I2CADDR);
Wire.write(25);
Wire.endTransmission();
Wire.beginTransmission(I2CADDR);
Wire.write(18);
Wire.endTransmission();
delay(100);
Wire.beginTransmission(I2CADDR);
Wire.write(26);
Wire.endTransmission();
Wire.beginTransmission(I2CADDR);
Wire.write(19);
Wire.endTransmission();
delay(100);
Wire.beginTransmission(I2CADDR);
Wire.write(27);
Wire.endTransmission();
Wire.beginTransmission(I2CADDR);
Wire.write(20);
Wire.endTransmission();
delay(100);
Wire.beginTransmission(I2CADDR);
Wire.write(28);
Wire.endTransmission();
Wire.beginTransmission(I2CADDR);
Wire.write(21);
Wire.endTransmission();
delay(100);
Wire.beginTransmission(I2CADDR);
Wire.write(29);
Wire.endTransmission();
Wire.beginTransmission(I2CADDR);
Wire.write(1);
Wire.endTransmission();
Wire.beginTransmission(I2CADDR);
Wire.requestFrom(I2CADDR,2);
resposta = Wire.read()<<8 | Wire.read();
Wire.endTransmission();
Serial.print(resposta);
Wire.beginTransmission(I2CADDR);
Wire.write(4);
Wire.endTransmission();
Wire.beginTransmission(I2CADDR);
Wire.requestFrom(I2CADDR,2);
resposta = Wire.read()<<8 | Wire.read();
Wire.endTransmission();
Serial.print("\t");
Serial.print(resposta);
Wire.beginTransmission(I2CADDR);
Wire.write(5);
Wire.endTransmission();
Wire.beginTransmission(I2CADDR);
Wire.requestFrom(I2CADDR,2);
resposta = Wire.read()<<8 | Wire.read();
Wire.endTransmission();
Serial.print("\t");
Serial.print(resposta);
Wire.beginTransmission(I2CADDR);
Wire.write(6);
Wire.endTransmission();
Wire.beginTransmission(I2CADDR);
Wire.requestFrom(I2CADDR,2);
resposta = Wire.read()<<8 | Wire.read();
Wire.endTransmission();
Serial.print("\t");
Serial.print(resposta);
Wire.beginTransmission(I2CADDR);
Wire.write(7);
Wire.endTransmission();
Wire.beginTransmission(I2CADDR);
Wire.requestFrom(I2CADDR,2);
resposta = Wire.read()<<8 | Wire.read();
Wire.endTransmission();
Serial.print("\t");
Serial.println(resposta);
}