aboutsummaryrefslogtreecommitdiff
path: root/Digital Photoreactor Controller Firmware/Test Sketchs/Slave_Random_LED_I2C/Slave_Random_LED_I2C.ino
blob: ef9df86485c4b88051202884b5bfed3d8ee35c89 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
////////////////////////////////////////////////////////////////////////////////////
// I2C test program for Digital Photoreactor Controller using TinyWireS library   //
//                    Run this slave program on the AtTiny85.                     //      
////////////////////////////////////////////////////////////////////////////////////
// This test program is adapted from the TinyWireS stress test program            //
// developed by Scott Hartog: https://github.com/rambo/TinyWire                   //
//                                                                                //
// The slave program receives via I2C N bytes of random data in a single          //
// receiveEvent() callback and stores that data in a global buffer.               //
// It then responds the first requestEvent() callback with the same data.         //
// The requestEvent() callback overwrites the data buffer with zeros after        //
// responding so it will only respond correctly to the first requestEvent()       //
// callback after each receiveEvent() callback. Subsequent requestEvent()         //
// will respond with 0xff for all data bytes.                                     //
//                                                                                //
//                                                                                //
// SETUP:                                                                         //
// AtTiny85 Pin 2 = PB3 = Blink LED                                               //
// Attiny85 Pin 3 (PB4) = LED PWM                                                 //
// AtTiny85 Pin 5 (PB0/SDA) = I2C SDA                                             //
//     connect to SDA on master with external pull-up (~4.7K)                     //
// AtTinyPin 6 (PB1) = Fan PWM                                                    //
// AtTiny Pin 7 (PB0/SCL) = I2C SCL                                               //
//     connect to SCL on master with external pull-up (~4.7K)                     //
// AtTiny Pin 1 (PB5/!RST)                                                        //
//     connect to reset on master (or just pull-up)                               //
//                                                                                //
////////////////////////////////////////////////////////////////////////////////////

#include "TinyWireS.h"                  // wrapper class for I2C slave routines

#define I2C_SLAVE_ADDR  0x26            // I2C slave address (38, 0x26), 

uint8_t master_data[16];               // global buffer to store data sent from the master.
uint8_t master_bytes;                  // global variable to number of bytes sent from the master.

const int LEDPin = 4;                  //Arduino pin 4, pin 3 on AtTiny85 pinout
const int FanPin = 1;                  //Arduino pin 1, pin 6 on AtTiny85 pinout
const int BlinkPin = 3;                //Arduino pin 3, pin 2 on AtTiny85 pinout

// Gets called when the ATtiny85 receives an I2C write slave request
void receiveEvent(uint8_t num_bytes)
{
  uint8_t i;
  
  // save the number of bytes sent from the master
  master_bytes = num_bytes;

  // store the data from the master into the data buffer
  for (i = 0; i < master_bytes; i++)
    master_data[i] = TinyWireS.receive();

  // set LED and Fan PWM duty to random byte values recieved from the master
  analogWrite(FanPin, master_data[0]);
  analogWrite(LEDPin, master_data[1]);

  // blink LED whenever data is successfuly recieved
  digitalWrite(BlinkPin, HIGH);
  delay(10);
  digitalWrite(BlinkPin, LOW);
  delay(10);

}

// Gets called when the ATtiny receives an i2c read slave request
void requestEvent()
{
  uint8_t i;
  
  // send the data buffer back to the master
  for (i = 0; i < master_bytes; i++)
    TinyWireS.send(master_data[i]);

  // corrupt the byte values in the data buffer
  // so that subsequent call won't match
  for (i = 0; i < master_bytes; i++)
    master_data[i] += 0x5a;

  // corrupt length of the request, but dont' make it zero
  
  // if the usiTwiSlave.c is working fine, then this number is completely irrelevant
  // because the requestEvent() callback will not be called again until
  // after the next receiveEvent() callback, so the master_data and
  // master_bytes variables will be set by that call.

  // If the usiTwiSlave.c has the issue of calling the requestFrom() callback
  // for each byte sent, the buffer will accumulate by this amount *for each byte
  // in the original request*.
  // 
  // Making it zero will obscure the 1-byte send issue in the usiTwiSlave.c
  // that is being tested.
  // Making it small will allow a few requests to succeed before the tx buffer
  // overflows and the usiTwiSlave.c hangs on the "while ( tmphead == txTail );"
  // line
  master_bytes = 2; 
}

void setup()
{
  // initialize the TinyWireS and usiTwiSlave libraries
  TinyWireS.begin(I2C_SLAVE_ADDR);      // init I2C Slave mode

  // register the onReceive() callback function
  TinyWireS.onReceive(receiveEvent);
  
  // register the onRequest() callback function
  TinyWireS.onRequest(requestEvent);

  pinMode(LEDPin, OUTPUT);   // set pin for LED PWM
  pinMode(FanPin, OUTPUT);   // set pin for Fan PWM
  pinMode(BlinkPin, OUTPUT); // set pin to blink LED
  
  TCCR0B = TCCR0B & 0b11111000 | 0b001; // sets internal timer of AtTiny85 to 31250 Hz for fast PWM for controlling fan speed
}

void loop()
{
  // this needs to be here 
  /////////////Does this really need to be here?????
  //TinyWireS_stop_check();
  // otherwise empty loop
}