Hallo Leute,
ich versuche zwischen einem Arduino Nano und einem ATtiny84 Daten per I2C auszutauschen.
Leider bleibt mein Master in den send oder request schleifen hängen, ob der Slave alles richtig macht kann ich dadurch leider auch nicht sagen, aber dieser läuft wenigstens den loop fleißig durch.
Hoffentlich könnt ihr mir dabei weiterhelfen, habe noch nie zuvor I2C verwendet und komme einfach nicht mehr weiter.
Mal ein kleiner Überblick damit ihr wisst um was es geht.
Der Arduino(Master) soll per I2C Daten an den Slave senden
- einen Status welchen ich mit den Zahlen 1-9 definiere wodurch verschiedene LED-Blinkmuster am Slave erzeugt werden sollen
- PWM Helligkeit für die LED´s am Slave 0-255
und einen Wert von diesem empfangen.
- eingelesener ADC wert von 0 bis 1023, welcher dann im Master den Status ändern kann.
Am liebsten würde ich einfach ein Array senden, ist das denn möglich ohne irgendwelche umwandlungen?
Der Arduino Nano wird zum Programmieren des ATtiny verwendet, funktioniert problemlos.
Anschließend lade ich den Master-Sketch auf den Arduino.
Falls gewünscht kann ich auch versuchen einen Schaltplan meines derzeitigen Aufbaus zu zeichnen, aber vorerst hier erstmal mein Code.
Er Kompiliert ohne Fehler und lässt sich aufspielen.
//Master Arduino Nano
#include <Wire.h>
#define I2C_ADDR 0x4
int brightness;
int state;
int button;
int dimADC = 19; // A0 ADC PIN
int dimVal;
void setup()
{
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600);
pinMode(dimADC, INPUT);
pinMode(9, OUTPUT);
state = 8;
}
void loop() {
digitalWrite(9, HIGH); //loop test
delay(50);
digitalWrite(9, LOW);
delay(50);
Wire.requestFrom(I2C_ADDR, 1); //stucks right after this
while(Wire.available() > 0) {
button = Wire.read();
}
if (button == 0) {
state = 9;
}
if ((button == 1) || (button == 3)) {
state = 1;
}
if (button == 2) {
state = 6;
}
if (button == 4) { // The other states are not necessary at the moment
state = 7;
}
dimVal = analogRead(dimADC)/ 4;
Wire.beginTransmission(I2C_ADDR); // send the address
Wire.write(state);
Wire.write(dimVal);
Wire.endTransmission();
}
//Slave ATtiny 84
#include <TinyWireS.h> // I2C Bib
#define I2C_ADDR 0x4 // Slaveadress 7 Bit
#define INTERNAL2V56_NO_CAP (6) // VREF pin 0, no capacitor
int button;
// 0 = nothing pressed
// 1 = left button pressed
// 2 = right button pressed
// 3 = both pressed
// 4 = Error
int a; //ADC-value 0 to 1023
int pwm; //PWM 0 to 255
int adcPin = 1; //ADC in for Button
int green = 8; //Status LED green
int red = 7; //Status LED red
int backlight = 5; //LED Backlight
int d; //1-9 Blinkmodi
void setup() {
TinyWireS.begin(I2C_ADDR); //Adress slave
TinyWireS.onRequest(requestEvent);
TinyWireS.onReceive(receiveEvent);
pinMode(green,OUTPUT); // LED green
pinMode(red, OUTPUT); // LED red
pinMode(backlight, OUTPUT); // Backlight
pinMode(adcPin, INPUT); // Button ADC
pinMode(0, OUTPUT); // VREF 2.56V for ADC ???
analogReference( INTERNAL2V56_NO_CAP );
}
void loop() {
TinyWireS_stop_check();
analogWrite(backlight, pwm); // backlight
if (d == 1) {
analogWrite(green, pwm); // blink patterns
delay(500);
analogWrite(green, 0);
delay(500); }
if (d ==2) { analogWrite(green, pwm);
delay(1000);
analogWrite(green, 0);
delay(1000);
analogWrite(green, pwm);
delay(500);
analogWrite(green, 0);
delay(500);
analogWrite(green, pwm);
delay(500);
analogWrite(green, 0);
delay(500); }
if (d == 3) { analogWrite(green, pwm);
delay(1000);
analogWrite(green, 0);
delay(1000); }
if (d == 4) { analogWrite(red, pwm);
delay(1000);
analogWrite(red, 0);
delay(1000);
analogWrite(red, pwm);
delay(1000);
analogWrite(red, 0);
delay(5000); }
if (d == 5) { analogWrite(red, pwm);
delay(1000);
analogWrite(red, 0);
delay(1000); }
if (d == 6) { analogWrite(red, pwm);
delay(500);
analogWrite(red, 0);
delay(500); }
if (d == 7) { analogWrite(red, pwm); }
if (d == 8) { analogWrite(green, 0);
analogWrite(red, 0); }
if (d == 9) { analogWrite(green, pwm); }
a = analogRead (adcPin);
if ((a == 0) || (a > 1022)){ // Error
button = 4;
}
if ((a > 0) && (a <= 255)){ // nothing pressed
button = 0;
}
if ((a > 255) && (a <= 510)) { // 1 pressed
button = 1;
}
if ((a > 510) && (a <= 765)) { // 2 pressed
button = 2;
}
if ((a > 765) && (a <= 1022)){ // 1 and 2 Pressed
button = 3;
}
}
void requestEvent() {
TinyWireS.send(button); // send button state
}
void receiveEvent() {
if(TinyWireS.available()) {
d = TinyWireS.receive();
pwm = TinyWireS.receive();
}
}
Die Verwendete Bibliothek für den ATtiny ist von hier: GitHub - svoisen/TinyWire: My modifications to TinyWire Arduino libs
Vielen Dank schonmal für eure Hilfe
Liebe Grüße, d3dx9