Skip to content

Instantly share code, notes, and snippets.

@boxysean
Created December 11, 2013 17:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save boxysean/7914612 to your computer and use it in GitHub Desktop.
Save boxysean/7914612 to your computer and use it in GitHub Desktop.
Arduino code to control Mic's Triac Bloc, which Mic documented here: http://wemakethings.net/2013/10/27/triac-bloc/
/**
* Arduino code to control Mic's Triac Bloc, which Mic documented here:
* http://wemakethings.net/2013/10/27/triac-bloc/
*
* by boxysean, Dec 11 2013 -- Dash 7 Design
*/
#include <Wire.h>
#define COMMAND_CALIBRATE 'c'
#define COMMAND_DIAGNOSTICS 'd'
#define COMMAND_POWER 'p'
#define COMMAND_RESET 'r'
#define COMMAND_POWER_UP '+'
#define COMMAND_POWER_UP_2 '='
#define COMMAND_POWER_DOWN '-'
#define I2C_SET_DIMMER_POWER 1
#define I2C_READ_PERIOD_LENGTH 4
#define I2C_READ_ZC_PULSE_LENGTH 5
#define I2C_READ_OSCCAL 6
#define I2C_READ_CONDUCTION_ANGLE 7
#define I2C_READ_LAST_PERIOD_LENGTH 8
#define I2C_RESET 9
#define I2C_CALIBRATE 10
#define I2C_ADDRESS 0x20
char variableName[5][20] = { "periodLength", "zcPulseLength", "osccal", "conductionAngle", "lastPeriodLength" };
int i2cCommand[5] = { 4, 5, 6, 7, 8 };
int i2cBytesReturned[5] = { 2, 2, 1, 2, 2 };
int power;
void setup() {
Wire.begin();
Serial.begin(9600);
}
int readWire(int bytes) {
int res = 0;
for (int i = 0; i < bytes; i++) {
res <<= 8;
res |= Wire.read();
}
return res;
}
void setPower(int p) {
power = max(0, min(255, p));
Wire.beginTransmission(I2C_ADDRESS);
Wire.write(I2C_SET_DIMMER_POWER);
Wire.write(power);
Wire.endTransmission();
Serial.print("setting power to ");
Serial.println(power);
}
void printDiagnostics(int i) {
Wire.beginTransmission(I2C_ADDRESS);
Wire.write(i2cCommand[i]);
Wire.endTransmission();
Wire.requestFrom(I2C_ADDRESS, i2cBytesReturned[i]);
delay(100);
Serial.print(variableName[i]);
Serial.print(": ");
Serial.println(readWire(i2cBytesReturned[i]));
}
void loop() {
while (!Serial.available()) {
// nop
}
switch (Serial.read()) {
case COMMAND_DIAGNOSTICS:
Serial.print("\n== ");
Serial.print(millis());
Serial.println(" ==");
for (int i = 0; i < 5; i++) {
printDiagnostics(i);
}
break;
case COMMAND_POWER:
power = (int) ((Serial.read() - '0') / 9.0 * 255.0);
setPower(power);
break;
case COMMAND_CALIBRATE:
Wire.beginTransmission(I2C_ADDRESS);
Wire.write(I2C_CALIBRATE);
Wire.endTransmission();
Serial.println("calibrating");
break;
case COMMAND_RESET:
Wire.beginTransmission(I2C_ADDRESS);
Wire.write(I2C_RESET);
Wire.endTransmission();
Serial.println("reset");
break;
case COMMAND_POWER_UP:
case COMMAND_POWER_UP_2:
setPower(power+1);
break;
case COMMAND_POWER_DOWN:
setPower(power-1);
break;
default:
Serial.println("unknown command");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment