Created
December 11, 2013 17:19
-
-
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/
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 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