Skip to content

2 Bytes I2c #73

@robstave

Description

@robstave

I about gave up on this.
Keep trying

// reciever/master rot

#include <Wire.h> ;

void setup() {
pinMode(1, OUTPUT); // visualize rotory
pinMode(3, OUTPUT); // visualize button

// Wire.begin(); // join i2c bus (address optional for master)
}

void loop() {

//  digitalWrite(3, HIGH);
 
 //   analogWrite(1, 255);

while (true) {
Wire.requestFrom(4, 2); // request 2 byte from rotory device ( value, button ) address 4

if (Wire.available()  ) {     // Ensure we have received 2 bytes
  uint8_t value = Wire.read();   // Read the first byte
  uint8_t value2 = Wire.read();  // Read the second byte

analogWrite(1, value);
analogWrite(3, value2);

/*
if (value > 1) {
digitalWrite(3, HIGH);
} else {
digitalWrite(3, LOW);
}

  if (value2 > 1) {
    analogWrite(1, value2);
  } else {
    digitalWrite(1, LOW);
  }
  */
}
 delay(100);

}

}


// example rot + button

#include "avr/interrupt.h";
#define I2C_ROTORY_ADDRESS 0x04 // Address of the slave

#include <Wire.h>

volatile int value = 122;
volatile int lastEncoded = 0;

void setup() {
Wire.begin(I2C_ROTORY_ADDRESS); // join i2c network
//TinyWireS.onReceive(receiveEvent); // not using this
Wire.onRequest(requestEvent);
// set pins 3 and 4 to input
// and enable pullup resisters
pinMode(3, INPUT);
pinMode(4, INPUT);
//pinMode(2, INPUT);
pinMode(1, INPUT);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);

GIMSK = 0b00100000; // Enable pin change interrupts
PCMSK = 0b00011000; // Enable pin change interrupt for PB3 and PB4
sei(); // Turn on interrupts
}

// Gets called when the ATtiny receives an i2c request
void requestEvent() {

/*
byte button;

if (digitalRead(1)==HIGH){
button = 255;
} else {
button = 0;
}

byte j = value;
byte message[2] = {button, j};
Wire.write(message, 2);
*/

//byte message[2];
//message[0] = 0x25;
//message[1] = 0x75;
Wire.write(0xa0);
Wire.write(0x45);

//Wire.write(message, 2);

//uint16_t combined = (button << 8) | value;

//Wire.write((byte*)&combined, 2); // Send the 2-byte combined value
}

void loop() {
delay(100);
}

// This is the ISR that is called on each interrupt
// Taken from http://bildr.org/2012/08/rotary-encoder-arduino/
ISR(PCINT0_vect) {
int MSB = digitalRead(3); //MSB = most significant bit
int LSB = digitalRead(4); //LSB = least significant bit

int encoded = (MSB << 1) | LSB; //converting the 2 pin value to single number
int sum = (lastEncoded << 2) | encoded; //adding it to the previous encoded value

if (sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011)
value++;
if (sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000)
value--;

lastEncoded = encoded; //store this value for next time

if (value <= 0)
value = 0;
if (value >= 255)
value = 255;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions