Temperature Controller
(→Example of Method) |
Jvaughters (Talk | contribs) |
||
(10 intermediate revisions by 2 users not shown) | |||
Line 2: | Line 2: | ||
== Warning == | == Warning == | ||
'''This page is in progress and none of the code can be considered good or complete. I am just using this as an alternate storage of the code for right now.''' | '''This page is in progress and none of the code can be considered good or complete. I am just using this as an alternate storage of the code for right now.''' | ||
− | + | <anyweb>http://combustory.com/wiki/ads/ad_rtc_1.html</anyweb> | |
== Summary == | == Summary == | ||
== Functional Description of the Method == | == Functional Description of the Method == | ||
Line 12: | Line 12: | ||
==== X9241A - Digital Potentiometer ==== | ==== X9241A - Digital Potentiometer ==== | ||
− | + | Detail on this page [[X9241A - Digital Potentiometer]] | |
− | * Read WCR(Wiper Control Register) for the four potentiometers 0-3 | + | There are basically only two functions that I am after right now which are both three byte instructions: |
+ | |||
+ | * Read WCR(Wiper Control Register) for the four potentiometers 0-3 (So far this is failing miserably) | ||
** Send 1st byte - Address (my circuit - 01011010 or 0x2D)(binary - 0101 A3 A2 A1 A0) A values are actual pins set to high or low for an address. | ** Send 1st byte - Address (my circuit - 01011010 or 0x2D)(binary - 0101 A3 A2 A1 A0) A values are actual pins set to high or low for an address. | ||
** Send 2nd byte - Instruction (binary - 1001 (1/0)(1/0) 00) - The two bits are used to choose the potentiometer | ** Send 2nd byte - Instruction (binary - 1001 (1/0)(1/0) 00) - The two bits are used to choose the potentiometer | ||
** Read WCR requested Byte | ** Read WCR requested Byte | ||
− | * Write WCR for the four potentiometers 0-3 | + | * Write WCR for the four potentiometers 0-3 (This works) |
** Send 1st byte - Address (my circuit - 01011010 or 0x2D)(binary - 0101 A3 A2 A1 A0) A values are actual pins set to high or low for an address. | ** Send 1st byte - Address (my circuit - 01011010 or 0x2D)(binary - 0101 A3 A2 A1 A0) A values are actual pins set to high or low for an address. | ||
** Send 2nd byte - Instruction (binary - 1010 (1/0)(1/0) 00) - The two bits are used to choose the potentiometer | ** Send 2nd byte - Instruction (binary - 1010 (1/0)(1/0) 00) - The two bits are used to choose the potentiometer | ||
** Send WCR Byte - Potentiometer value (binary - 00 D5 D4 D3 D2 D1 D0) - D values are the 0-63 potentiometer positions | ** Send WCR Byte - Potentiometer value (binary - 00 D5 D4 D3 D2 D1 D0) - D values are the 0-63 potentiometer positions | ||
+ | '''Sample Code''' | ||
+ | <pre> | ||
+ | Wire.beginTransmission(X9241_I2C_ADDRESS); | ||
+ | Wire.send(0xa0); //Instruction to write WCR-00 | ||
+ | Wire.send(0x20); //Send a D value of 32 | ||
+ | Wire.endTransmission(); | ||
+ | </pre> | ||
==== DS1307 - Real Time Clock ==== | ==== DS1307 - Real Time Clock ==== | ||
− | The code for this very useful chip came from the [[ | + | The code for this very useful chip came from the [[RTC1307 - Real Time Clock]] |
− | ==== A/C_Control_v.01 code ==== | + | ==== A/C_Control_v.01 code for Arduino ==== |
''' While this says v.01, don't count on it being a released v.01, I am still working on v.01, this is a back up ''' | ''' While this says v.01, don't count on it being a released v.01, I am still working on v.01, this is a back up ''' | ||
Line 48: | Line 57: | ||
* A(0-1) - Manual AC on command A1 is AC on, A0 is AC off | * A(0-1) - Manual AC on command A1 is AC on, A0 is AC off | ||
* F(0-1) - Manual AC on command A1 is FAN on, A0 is FAN off | * F(0-1) - Manual AC on command A1 is FAN on, A0 is FAN off | ||
− | * | + | * B(00-59)(00-59)(00-23)(1-7)(01-31)(01-12)(00-99) - B(sec)(min)(hour)(dayOfWeek)(dayOfMonth)(month)(year) - B Sets the date of the RTC DS1307 Chip. ex. B1157193040209 |
+ | * R(0-4) - Need to Define this better it is for transferring X9241 registers | ||
+ | * S - System Status | ||
+ | * Q(1-2) - (1) Memory initialize (2) RTC - Memory Dump | ||
*/ | */ | ||
− | + | #include <math.h> | |
#include "Wire.h" | #include "Wire.h" | ||
#define DS1307_I2C_ADDRESS 0x68 | #define DS1307_I2C_ADDRESS 0x68 | ||
+ | #define X9241_I2C_ADDRESS 0x2D | ||
// Global Variables | // Global Variables | ||
Line 79: | Line 92: | ||
int fan_on = 12; | int fan_on = 12; | ||
int command = 0; // This is the command char, in ascii form, sent from the serial port | int command = 0; // This is the command char, in ascii form, sent from the serial port | ||
+ | int i; | ||
long polltime = 1000; // The time to Poll the tempPins | long polltime = 1000; // The time to Poll the tempPins | ||
long previousMillis = 0; // will store last time Temp was updated | long previousMillis = 0; // will store last time Temp was updated | ||
Line 84: | Line 98: | ||
long ac_on_delay = 10000; // Time to wait before checking the ducts again | long ac_on_delay = 10000; // Time to wait before checking the ducts again | ||
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; | byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; | ||
− | + | byte test; | |
// Convert normal decimal numbers to binary coded decimal | // Convert normal decimal numbers to binary coded decimal | ||
Line 103: | Line 117: | ||
// Assumes you're passing in valid numbers | // Assumes you're passing in valid numbers | ||
// Watch for scope issues with Global Variables | // Watch for scope issues with Global Variables | ||
− | / | + | // This function is ripe for bugs. Probably need to put in checks for valid numbers or the RTC will get hung up. |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
void setDateDs1307() | void setDateDs1307() | ||
{ | { | ||
+ | |||
+ | second = (byte) ((Serial.read() - 48) * 10 + (Serial.read() - 48)); // Use of (byte) type casting and ascii math to achieve result. | ||
+ | minute = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); | ||
+ | hour = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); | ||
+ | dayOfWeek = (byte) (Serial.read() - 48); | ||
+ | dayOfMonth = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); | ||
+ | month = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); | ||
+ | year= (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); | ||
Wire.beginTransmission(DS1307_I2C_ADDRESS); | Wire.beginTransmission(DS1307_I2C_ADDRESS); | ||
− | Wire.send( | + | Wire.send(0x00); |
Wire.send(decToBcd(second)); // 0 to bit 7 starts the clock | Wire.send(decToBcd(second)); // 0 to bit 7 starts the clock | ||
Wire.send(decToBcd(minute)); | Wire.send(decToBcd(minute)); | ||
Line 131: | Line 147: | ||
// Reset the register pointer | // Reset the register pointer | ||
Wire.beginTransmission(DS1307_I2C_ADDRESS); | Wire.beginTransmission(DS1307_I2C_ADDRESS); | ||
− | Wire.send( | + | Wire.send(0x00); |
Wire.endTransmission(); | Wire.endTransmission(); | ||
Line 157: | Line 173: | ||
Serial.print(year, DEC); | Serial.print(year, DEC); | ||
+ | } | ||
+ | |||
+ | double Thermister(int RawADC) { // Nice little Function found on the Arduino Playground to convert a Thermistor voltage to a Temp in F | ||
+ | double Temp; | ||
+ | Temp = log(((10240000/RawADC) - 10000)); | ||
+ | Temp = 1 / (0.001129148 + (0.000234125 * Temp) + (0.0000000876741 * Temp * Temp * Temp)); | ||
+ | Temp = Temp - 273.15; // Convert Kelvin to Celcius | ||
+ | Temp = (Temp * 9.0)/ 5.0 + 32.0; // Convert Celcius to Fahrenheit | ||
+ | return Temp; | ||
} | } | ||
Line 169: | Line 194: | ||
pinMode(ac_on, OUTPUT); | pinMode(ac_on, OUTPUT); | ||
pinMode(fan_on, OUTPUT); | pinMode(fan_on, OUTPUT); | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
} | } | ||
Line 206: | Line 223: | ||
val_cnt = 0; | val_cnt = 0; | ||
} | } | ||
− | temp1_avg = (temp1_val[0] + temp1_val[1] + temp1_val[2] + temp1_val[3] + temp1_val[4])/5; | + | temp1_avg = (temp1_val[0] + temp1_val[1] + temp1_val[2] + temp1_val[3] + temp1_val[4])/5; // Take 5 sec average of temperature |
temp2_avg = (temp2_val[0] + temp2_val[1] + temp2_val[2] + temp2_val[3] + temp2_val[4])/5; | temp2_avg = (temp2_val[0] + temp2_val[1] + temp2_val[2] + temp2_val[3] + temp2_val[4])/5; | ||
temp3_avg = (temp3_val[0] + temp3_val[1] + temp3_val[2] + temp3_val[3] + temp3_val[4])/5; | temp3_avg = (temp3_val[0] + temp3_val[1] + temp3_val[2] + temp3_val[3] + temp3_val[4])/5; | ||
Line 225: | Line 242: | ||
if (command == 49) { // If command = "1" print the Temp1 | if (command == 49) { // If command = "1" print the Temp1 | ||
Serial.print("Temp1 = "); | Serial.print("Temp1 = "); | ||
− | Serial.print(temp1_avg); // | + | Serial.print(int(Thermister(temp1_avg))); // |
Serial.print(" "); | Serial.print(" "); | ||
} | } | ||
else if (command == 50) { // If command = "2" print the Temp2 | else if (command == 50) { // If command = "2" print the Temp2 | ||
Serial.print("Temp2 = "); | Serial.print("Temp2 = "); | ||
− | Serial.print(temp2_avg); // | + | Serial.print(int(Thermister(temp2_avg))); // |
Serial.print(" "); | Serial.print(" "); | ||
} | } | ||
else if (command == 51) { // If command = "3" print the Temp3 | else if (command == 51) { // If command = "3" print the Temp3 | ||
Serial.print("Temp3 = "); | Serial.print("Temp3 = "); | ||
− | Serial.print(temp3_avg); // | + | Serial.print(int(Thermister(temp3_avg))); // |
Serial.print(" "); | Serial.print(" "); | ||
} | } | ||
else if (command == 52) { // If command = "4" print the Temp4 | else if (command == 52) { // If command = "4" print the Temp4 | ||
Serial.print("Temp4 = "); | Serial.print("Temp4 = "); | ||
− | Serial.print(temp4_avg); // | + | Serial.print(int(Thermister(temp4_avg))); // |
Serial.print(" "); | Serial.print(" "); | ||
} | } | ||
Line 252: | Line 269: | ||
THRESHOLD1 += command - 48; // ASCII math to get value sent | THRESHOLD1 += command - 48; // ASCII math to get value sent | ||
Serial.print("THRESHOLD1 = "); | Serial.print("THRESHOLD1 = "); | ||
− | Serial.print(THRESHOLD1); // | + | Serial.print(int(Thermister(THRESHOLD1))); // |
Serial.print(" "); | Serial.print(" "); | ||
} | } | ||
Line 261: | Line 278: | ||
THRESHOLD2 += command - 48; // ASCII math to get value sent | THRESHOLD2 += command - 48; // ASCII math to get value sent | ||
Serial.print("THRESHOLD2 = "); | Serial.print("THRESHOLD2 = "); | ||
− | Serial.print(THRESHOLD2); // | + | Serial.print(int(Thermister(THRESHOLD2))); // |
Serial.print(" "); | Serial.print(" "); | ||
} | } | ||
Line 270: | Line 287: | ||
THRESHOLD3 += command - 48; // ASCII math to get value sent | THRESHOLD3 += command - 48; // ASCII math to get value sent | ||
Serial.print("THRESHOLD3 = "); | Serial.print("THRESHOLD3 = "); | ||
− | Serial.print(THRESHOLD3); // | + | Serial.print(int(Thermister(THRESHOLD3))); // |
Serial.print(" "); | Serial.print(" "); | ||
} | } | ||
Line 279: | Line 296: | ||
THRESHOLD4 += command - 48; // ASCII math to get value sent | THRESHOLD4 += command - 48; // ASCII math to get value sent | ||
Serial.print("THRESHOLD4 = "); | Serial.print("THRESHOLD4 = "); | ||
− | Serial.print(THRESHOLD4); // | + | Serial.print(int(Thermister(THRESHOLD4))); // |
Serial.print(" "); | Serial.print(" "); | ||
} | } | ||
Line 293: | Line 310: | ||
THRESHOLD1 -= command - 48; // ASCII math to get value sent | THRESHOLD1 -= command - 48; // ASCII math to get value sent | ||
Serial.print("THRESHOLD1 = "); | Serial.print("THRESHOLD1 = "); | ||
− | Serial.print(THRESHOLD1); // | + | Serial.print(int(Thermister(THRESHOLD1))); // |
Serial.print(" "); | Serial.print(" "); | ||
} | } | ||
Line 302: | Line 319: | ||
THRESHOLD2 -= command - 48; // ASCII math to get value sent | THRESHOLD2 -= command - 48; // ASCII math to get value sent | ||
Serial.print("THRESHOLD2 = "); | Serial.print("THRESHOLD2 = "); | ||
− | Serial.print(THRESHOLD2); // | + | Serial.print(int(Thermister(THRESHOLD2))); // |
Serial.print(" "); | Serial.print(" "); | ||
} | } | ||
Line 311: | Line 328: | ||
THRESHOLD3 -= command - 48; // ASCII math to get value sent | THRESHOLD3 -= command - 48; // ASCII math to get value sent | ||
Serial.print("THRESHOLD3 = "); | Serial.print("THRESHOLD3 = "); | ||
− | Serial.print(THRESHOLD3); // | + | Serial.print(int(Thermister(THRESHOLD3))); // |
Serial.print(" "); | Serial.print(" "); | ||
} | } | ||
Line 320: | Line 337: | ||
THRESHOLD4 -= command - 48; // ASCII math to get value sent | THRESHOLD4 -= command - 48; // ASCII math to get value sent | ||
Serial.print("THRESHOLD4 = "); | Serial.print("THRESHOLD4 = "); | ||
− | Serial.print(THRESHOLD4); // | + | Serial.print(int(Thermister(THRESHOLD4))); // |
Serial.print(" "); | Serial.print(" "); | ||
} | } | ||
Line 368: | Line 385: | ||
Serial.println(" "); | Serial.println(" "); | ||
Serial.print("Temp1 = "); | Serial.print("Temp1 = "); | ||
− | Serial.println(temp1_avg); | + | Serial.println(int(Thermister(temp1_avg))); |
Serial.print("Temp2 = "); | Serial.print("Temp2 = "); | ||
− | Serial.println(temp2_avg); | + | Serial.println(int(Thermister(temp2_avg))); |
Serial.print("Temp3 = "); | Serial.print("Temp3 = "); | ||
− | Serial.println(temp3_avg); | + | Serial.println(int(Thermister(temp3_avg))); |
Serial.print("Temp4 = "); | Serial.print("Temp4 = "); | ||
− | Serial.println(temp4_avg); | + | Serial.println(int(Thermister(temp4_avg))); |
Serial.println(" "); | Serial.println(" "); | ||
Serial.print("THRESHOLD1 = "); | Serial.print("THRESHOLD1 = "); | ||
− | Serial.println(THRESHOLD1); | + | Serial.println(int(Thermister(THRESHOLD1))); |
Serial.print("THRESHOLD2 = "); | Serial.print("THRESHOLD2 = "); | ||
− | Serial.println(THRESHOLD2); | + | Serial.println(int(Thermister(THRESHOLD2))); |
Serial.print("THRESHOLD3 = "); | Serial.print("THRESHOLD3 = "); | ||
− | Serial.println(THRESHOLD3); | + | Serial.println(int(Thermister(THRESHOLD3))); |
Serial.print("THRESHOLD4 = "); | Serial.print("THRESHOLD4 = "); | ||
− | Serial.println(THRESHOLD4); | + | Serial.println(int(Thermister(THRESHOLD4))); |
Serial.println(" "); | Serial.println(" "); | ||
if (digitalRead(duct1) == HIGH) {Serial.println("duct1 ON");} | if (digitalRead(duct1) == HIGH) {Serial.println("duct1 ON");} | ||
Line 405: | Line 422: | ||
} | } | ||
− | else if (command == | + | else if (command == 66) { //If command = "B" Set Date |
setDateDs1307(); | setDateDs1307(); | ||
getDateDs1307(); | getDateDs1307(); | ||
Serial.println(" "); | Serial.println(" "); | ||
+ | } | ||
+ | else if (command == 81) { //If command = "Q" RTC1307 Functions | ||
+ | |||
+ | // Wire.beginTransmission(DS1307_I2C_ADDRESS); | ||
+ | // Wire.send(0x0f); | ||
+ | // Wire.send(0xff); | ||
+ | // Wire.endTransmission(); | ||
+ | if (Serial.available()) { | ||
+ | command = Serial.read(); | ||
+ | if (command == 49) { //If command = "1" RTC1307 Initialize Memory - All Data will be set to 1. Therefore 1 or 0 will not be a valid value. | ||
+ | Wire.beginTransmission(DS1307_I2C_ADDRESS); // 1 will be the init value and 0 will be cosidered an error that occurs when the RTC is in Battery mode. | ||
+ | Wire.send(0x08); | ||
+ | for (i = 1; i <= 27; i++) { | ||
+ | Wire.send(0xff); | ||
+ | delay(100); | ||
+ | } | ||
+ | Wire.endTransmission(); | ||
+ | getDateDs1307(); | ||
+ | Serial.println(": RTC1307 Initialized Memory"); | ||
+ | } | ||
+ | else if (command == 50) { //If command = "2" RTC1307 Memory Dump | ||
+ | getDateDs1307(); | ||
+ | Serial.println(": RTC 1307 Dump Begin"); | ||
+ | Wire.beginTransmission(DS1307_I2C_ADDRESS); | ||
+ | Wire.send(0x00); | ||
+ | Wire.endTransmission(); | ||
+ | Wire.requestFrom(DS1307_I2C_ADDRESS, 65); | ||
+ | for (i = 1; i <= 65; i++) { | ||
+ | test = Wire.receive(); | ||
+ | Serial.print(i); | ||
+ | Serial.print(":"); | ||
+ | Serial.println(test, DEC); | ||
+ | } | ||
+ | Wire.endTransmission(); | ||
+ | Serial.println(" RTC1307 Dump end"); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | else if (command == 82) { //If command = "R" Set Duct Position | ||
+ | if (Serial.available()) { | ||
+ | command = Serial.read(); | ||
+ | // This code sets up the Persistent Registers and is not necessarily needed all the time, so can be removed from program eventually | ||
+ | if (command == 49) { // If command = "1" | ||
+ | Wire.beginTransmission(X9241_I2C_ADDRESS); | ||
+ | Wire.send(0xc0); // This is the set register command c and the 16 registers are 0-f | ||
+ | Wire.send(0x0a); // This line is the value to set the register | ||
+ | Wire.endTransmission(); | ||
+ | delay(100); | ||
+ | Wire.beginTransmission(X9241_I2C_ADDRESS); | ||
+ | Wire.send(0xc1); | ||
+ | Wire.send(0x14); | ||
+ | Wire.endTransmission(); | ||
+ | delay(100); | ||
+ | Wire.beginTransmission(X9241_I2C_ADDRESS); | ||
+ | Wire.send(0xc2); | ||
+ | Wire.send(0x20); | ||
+ | Wire.endTransmission(); | ||
+ | delay(100); | ||
+ | Wire.beginTransmission(X9241_I2C_ADDRESS); | ||
+ | Wire.send(0xc3); | ||
+ | Wire.send(0x3c); | ||
+ | Wire.endTransmission(); | ||
+ | delay(100); | ||
+ | Wire.beginTransmission(X9241_I2C_ADDRESS); | ||
+ | Wire.send(0xc4); | ||
+ | Wire.send(0x0a); | ||
+ | Wire.endTransmission(); | ||
+ | delay(100); | ||
+ | Wire.beginTransmission(X9241_I2C_ADDRESS); | ||
+ | Wire.send(0xc5); | ||
+ | Wire.send(0x14); | ||
+ | Wire.endTransmission(); | ||
+ | delay(100); | ||
+ | Wire.beginTransmission(X9241_I2C_ADDRESS); | ||
+ | Wire.send(0xc6); | ||
+ | Wire.send(0x20); | ||
+ | Wire.endTransmission(); | ||
+ | delay(100); | ||
+ | Wire.beginTransmission(X9241_I2C_ADDRESS); | ||
+ | Wire.send(0xc7); | ||
+ | Wire.send(0x3c); | ||
+ | delay(100); | ||
+ | Wire.beginTransmission(X9241_I2C_ADDRESS); | ||
+ | Wire.send(0xc8); | ||
+ | Wire.send(0x0a); | ||
+ | Wire.endTransmission(); | ||
+ | delay(100); | ||
+ | Wire.beginTransmission(X9241_I2C_ADDRESS); | ||
+ | Wire.send(0xc9); | ||
+ | Wire.send(0x14); | ||
+ | Wire.endTransmission(); | ||
+ | delay(100); | ||
+ | Wire.beginTransmission(X9241_I2C_ADDRESS); | ||
+ | Wire.send(0xca); | ||
+ | Wire.send(0x20); | ||
+ | Wire.endTransmission(); | ||
+ | delay(100); | ||
+ | Wire.beginTransmission(X9241_I2C_ADDRESS); | ||
+ | Wire.send(0xcb); | ||
+ | Wire.send(0x3c); | ||
+ | Wire.endTransmission(); | ||
+ | delay(100); | ||
+ | Wire.beginTransmission(X9241_I2C_ADDRESS); | ||
+ | Wire.send(0xcc); | ||
+ | Wire.send(0x0a); | ||
+ | Wire.endTransmission(); | ||
+ | delay(100); | ||
+ | Wire.beginTransmission(X9241_I2C_ADDRESS); | ||
+ | Wire.send(0xcd); | ||
+ | Wire.send(0x14); | ||
+ | Wire.endTransmission(); | ||
+ | delay(100); | ||
+ | Wire.beginTransmission(X9241_I2C_ADDRESS); | ||
+ | Wire.send(0xce); | ||
+ | Wire.send(0x20); | ||
+ | Wire.endTransmission(); | ||
+ | delay(100); | ||
+ | Wire.beginTransmission(X9241_I2C_ADDRESS); | ||
+ | Wire.send(0xcf); | ||
+ | Wire.send(0x3c); | ||
+ | Wire.endTransmission(); | ||
+ | } | ||
+ | else if (command == 50) { // If command = "2" | ||
+ | Wire.beginTransmission(X9241_I2C_ADDRESS); | ||
+ | Wire.send(0x10); // Global Load WCR's with Reg-00 | ||
+ | Wire.endTransmission(); | ||
+ | } | ||
+ | else if (command == 51) { // If command = "3" | ||
+ | Wire.beginTransmission(X9241_I2C_ADDRESS); | ||
+ | Wire.send(0x11); // Global Load WCR's with Reg-01 | ||
+ | Wire.endTransmission(); | ||
+ | } | ||
+ | else if (command == 52) { // If command = "4" | ||
+ | Wire.beginTransmission(X9241_I2C_ADDRESS); | ||
+ | Wire.send(0x12); // Global Load WCR's with Reg-10 | ||
+ | Wire.endTransmission(); | ||
+ | } | ||
+ | else if (command == 53) { // If command = "5" | ||
+ | Wire.beginTransmission(X9241_I2C_ADDRESS); | ||
+ | Wire.send(0x13); // Global Load WCR's with Reg-11 | ||
+ | Wire.endTransmission(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | //*********** Read operation just not working :~( | ||
+ | //Wire.beginTransmission(X9241_I2C_ADDRESS); | ||
+ | //Wire.send(0x90); | ||
+ | //Serial.println("made it 1"); | ||
+ | // Wire.endTransmission(); | ||
+ | //Serial.println(test, DEC); | ||
+ | //Wire.beginTransmission(X9241_I2C_ADDRESS); | ||
+ | //Wire.requestFrom(X9241_I2C_ADDRESS, 1); | ||
+ | //Wire.send(0x90); | ||
+ | //Serial.println("made it 2"); | ||
+ | //test = bcdToDec(Wire.receive()); | ||
+ | //test = Wire.receive(); | ||
+ | //Serial.println(test, DEC); | ||
+ | //Serial.println(Wire.available()); | ||
+ | //Wire.endTransmission(); | ||
+ | //Serial.println(test, DEC); | ||
+ | |||
+ | |||
} | } | ||
Serial.println(command); // Echo command char found in serial que | Serial.println(command); // Echo command char found in serial que | ||
Line 416: | Line 595: | ||
} | } | ||
//*****************************************************The End*********************** | //*****************************************************The End*********************** | ||
+ | |||
+ | </pre> | ||
+ | |||
+ | ==== A/C_Control_v.02 code for AutoIT ==== | ||
+ | |||
+ | ''' While this says v.02, don't count on it being a released v.02, I am still working on v.02, this is a back up ''' | ||
+ | |||
+ | <pre> | ||
+ | ; Arduino Communications and Control | ||
+ | ; 2 Sep 2008 - John Vaughters <http://www.combustory.com> | ||
+ | ; This is a Utility to Communicate with the Arduino Control board for managing the Home Environment | ||
+ | #include <WindowsConstants.au3> | ||
+ | #include <GuiConstants.au3> | ||
+ | #include <GuiEdit.au3> | ||
+ | #include <file.au3> | ||
+ | #include <Date.au3> | ||
+ | #include <IE.au3> | ||
+ | ;Initialize Variable Defaults | ||
+ | $working_dir = @DesktopDir & "\" | ||
+ | $working_file = "arduino_log" | ||
+ | $poll_delay = 5000 ; This is the delay the program waits before collecting the command results | ||
+ | ;$network_dir = "P:\sketchbook\ArduinoSerial\" | ||
+ | $network_dir = "S:\" ; Change this to default before you release the SW | ||
+ | $process_results = False ;Processing Flag | ||
+ | $command_get_begin = TimerInit() ;Initialize Timer | ||
+ | ; GUI | ||
+ | GuiCreate(" A/C Control", 700, 600) | ||
+ | ; MENU | ||
+ | $filemenu = GuiCtrlCreateMenu("&File") | ||
+ | $fileitem = GUICtrlCreateMenuitem ("Open",$filemenu) | ||
+ | GUICtrlSetState(-1,$GUI_DEFBUTTON) | ||
+ | $exititem = GUICtrlCreateMenuitem ("Exit",$filemenu) | ||
+ | $helpmenu = GuiCtrlCreateMenu("Help") | ||
+ | $infoitem = GUICtrlCreateMenuitem ("Info",$helpmenu) | ||
+ | ; LOGO PIC | ||
+ | GuiCtrlCreatePic("logo.jpg",0,0, 100,140) | ||
+ | ; AVI for letting the user know the system is processing | ||
+ | $processing = GuiCtrlCreateAvi("sampleAVI.avi",0, 405, 140, 32, 32) | ||
+ | ; Tabbed Result Window | ||
+ | $tab_result_start_x = 20 | ||
+ | $tab_result_start_y = 175 | ||
+ | $tab_result_size_x = 650 | ||
+ | $tab_result_size_y = 400 | ||
+ | $tab_result_title_2 = "Command Results" | ||
+ | $tab_result_title_3 = "Status" | ||
+ | $tab_result_title_4 = "Sys Info" | ||
+ | GuiCtrlCreateTab($tab_result_start_x, $tab_result_start_y, $tab_result_size_x , $tab_result_size_y) | ||
+ | GuiCtrlCreateTabItem($tab_result_title_2) | ||
+ | $edit_ctl_tab2 = GuiCtrlCreateEdit(@CRLF & "", $tab_result_start_x + 10 , $tab_result_start_y + 40, $tab_result_size_x - 20, $tab_result_size_y - 50) | ||
+ | GuiCtrlCreateTabItem($tab_result_title_3) | ||
+ | $edit_ctl_tab3 = GuiCtrlCreateEdit(@CRLF & "", $tab_result_start_x + 10 , $tab_result_start_y + 40, $tab_result_size_x - 20, $tab_result_size_y - 50) | ||
+ | GuiCtrlCreateTabItem($tab_result_title_4) | ||
+ | $edit_ctl_tab4 = GuiCtrlCreateEdit(@CRLF & "", $tab_result_start_x + 10 , $tab_result_start_y + 40, $tab_result_size_x - 20, $tab_result_size_y - 50) | ||
+ | GuiCtrlCreateTabItem("") | ||
+ | ; Combo Arduino Command File Type | ||
+ | $combo_ctl_search_file = GuiCtrlCreatecombo("C10", 240, 145, 120, 100) | ||
+ | GUICtrlSetData(-1,"C15|D15|T1|","C10") ; add other item snd set a new default | ||
+ | GuiCtrlCreateLabel("Custom Command", 245, 170, 150, 20) | ||
+ | ; Temp Labels | ||
+ | $ctl_temp1_lbl = GuiCtrlCreateLabel("", 180, 25, 100, 22,$WS_DLGFRAME) | ||
+ | GUICtrlSetBkColor(-1,0xffffff) | ||
+ | $ctl_temp2_lbl = GuiCtrlCreateLabel("", 180, 50, 100, 22,$WS_DLGFRAME) | ||
+ | GUICtrlSetBkColor(-1,0xffffff) | ||
+ | $ctl_temp3_lbl = GuiCtrlCreateLabel("", 180, 75, 100, 22,$WS_DLGFRAME) | ||
+ | GUICtrlSetBkColor(-1,0xffffff) | ||
+ | $ctl_temp4_lbl = GuiCtrlCreateLabel("", 180, 100, 100, 22,$WS_DLGFRAME) | ||
+ | GUICtrlSetBkColor(-1,0xffffff) | ||
+ | $ctl_thresh1_lbl = GuiCtrlCreateLabel("", 300, 25, 150, 22,$WS_DLGFRAME) | ||
+ | GUICtrlSetBkColor(-1,0xffffff) | ||
+ | $ctl_thresh2_lbl = GuiCtrlCreateLabel("", 300, 50, 150, 22,$WS_DLGFRAME) | ||
+ | GUICtrlSetBkColor(-1,0xffffff) | ||
+ | $ctl_thresh3_lbl = GuiCtrlCreateLabel("", 300, 75, 150, 22,$WS_DLGFRAME) | ||
+ | GUICtrlSetBkColor(-1,0xffffff) | ||
+ | $ctl_thresh4_lbl = GuiCtrlCreateLabel("", 300, 100, 150, 22,$WS_DLGFRAME) | ||
+ | GUICtrlSetBkColor(-1,0xffffff) | ||
+ | ; Current Network Directory Label | ||
+ | ;$combo_ctl_network_dir = GuiCtrlCreateLabel($network_dir, 240, 20, 450, 22,$WS_DLGFRAME) | ||
+ | ;GUICtrlSetBkColor(-1,0xffffff) | ||
+ | ;GuiCtrlCreateLabel("Network Directory", 245, 45, 200, 20) | ||
+ | ; BUTTON | ||
+ | $search_btn = GuiCtrlCreateButton("Go", 370, 143, 25, 25) | ||
+ | ;$file_btn = GuiCtrlCreateButton("Working Dir", 125, 77, 100, 25) | ||
+ | ;$network_btn = GuiCtrlCreateButton("Network Dir", 125, 18, 100, 25) | ||
+ | $site_btn = GuiCtrlCreateButton("www.combustory.com", 0, 145, 135, 22) | ||
+ | $clear_btn = GuiCtrlCreateButton("Clear", 620, 170, 50, 22) | ||
+ | $temp1_btn = GuiCtrlCreateButton("Temp 1", 120, 25, 50, 22) | ||
+ | $temp2_btn = GuiCtrlCreateButton("Temp 2", 120, 50, 50, 22) | ||
+ | $temp3_btn = GuiCtrlCreateButton("Temp 3", 120, 75, 50, 22) | ||
+ | $temp4_btn = GuiCtrlCreateButton("Temp 4", 120, 100, 50, 22) | ||
+ | $poll_btn = GuiCtrlCreateButton("Poll", 120, 0, 50, 22) | ||
+ | $ac_btn = GuiCtrlCreateButton("A/C ON", 500, 75, 60, 22) | ||
+ | $fan_btn = GuiCtrlCreateButton("Fan ON", 500, 100, 60, 22) | ||
+ | $status_btn = GuiCtrlCreateButton("Status", 500, 125, 60, 22) | ||
+ | $set_time_btn = GuiCtrlCreateButton("Set Time", 500, 150, 60, 22) | ||
+ | ; List System Info | ||
+ | GuiCtrlSetData($edit_ctl_tab4, "Computer: " & @CRLF & _ | ||
+ | "----------------------------------------------------------" & @CRLF & _ | ||
+ | "IP Address: " & @IPAddress1 & @CRLF & _ | ||
+ | "Computer Name: " & @ComputerName & @CRLF & _ | ||
+ | "OS: " & @OSVersion & @CRLF & _ | ||
+ | "Sys Dir: " & @SystemDir & @CRLF & @CRLF) | ||
+ | ;************* | ||
+ | ; _Load_Results() loads the temp file into the desired control then deletes the temp file | ||
+ | ; $w_dir is the working directory where the file exists | ||
+ | ; $ctl_to_load is the place to load the file contents | ||
+ | ; $temp_file is the temporary file to load the data from | ||
+ | ; The function returns the number of lines loaded from the file or a zero for a failure | ||
+ | Func _Load_Results ($w_dir, $ctl_load_to, $temp_file) | ||
+ | Dim $aRecords | ||
+ | If Not _FileReadToArray($w_dir & $temp_file,$aRecords) Then | ||
+ | Return (0) ; Failure to read a file | ||
+ | EndIf | ||
+ | For $x = 1 to $aRecords[0] | ||
+ | if StringLen($aRecords[$x]) > 0 then GuiCtrlSetData($ctl_load_to, $aRecords[$x] & @CRLF, 1) | ||
+ | Next | ||
+ | ;Delete the temporary file | ||
+ | RunWait(@ComSpec & " /c " & "del " & $temp_file, $w_dir & "",@SW_HIDE) | ||
+ | Return ($aRecords[0]-1) | ||
+ | EndFunc | ||
+ | ;*********************** | ||
+ | ; _Load_Status_Messages() loads the messages that were logged by the control board into the command window | ||
+ | ; The variables seem to be global at this point, that should be changed though to make it a self contained func | ||
+ | Func _Load_Status_Messages () | ||
+ | RunWait(@ComSpec & " /c " & "type arduino_log>results.txt", $network_dir,@SW_HIDE) | ||
+ | ; Load command results into Command Results tab | ||
+ | GuiCtrlSetData($edit_ctl_tab2, "------------------------------------------------------------------" & @CRLF,1) | ||
+ | GuiCtrlSetData($edit_ctl_tab2, "Status Messages: " & @CRLF,1) | ||
+ | If Not _Load_Results ($network_dir, $edit_ctl_tab2, "results.txt") Then | ||
+ | GuiCtrlSetData($edit_ctl_tab2, "No Status Messages! " & @CRLF,1) | ||
+ | EndIf | ||
+ | GuiCtrlSetData($edit_ctl_tab2, "******************************************************************" & @CRLF,1) | ||
+ | RunWait(@ComSpec & " /c " & "echo>clear_log", $network_dir,@SW_HIDE) ; Send message to Linux polling script to clear the log | ||
+ | Sleep (1000) | ||
+ | EndFunc | ||
+ | ;************* | ||
+ | ; _Send_Command() Sends a command to the control board | ||
+ | ; $w_dir is the working directory where the file exists | ||
+ | ; $n_dir is the network directory where the to copy the command file | ||
+ | ; $cmd is the command to send the control board | ||
+ | Func _Send_Command ($w_dir, $n_dir, $cmd) | ||
+ | $file = FileOpen($w_dir & "command", 2) | ||
+ | ; Check if file opened OK | ||
+ | If $file = -1 Then | ||
+ | MsgBox(0, "Error", "Unable to open file.") | ||
+ | Exit | ||
+ | EndIf | ||
+ | FileWrite($file, $cmd) | ||
+ | FileClose($file) ; The File must be closed before you can copy it anywhere | ||
+ | RunWait(@ComSpec & " /c " & "copy command " & $n_dir, $w_dir,@SW_HIDE) | ||
+ | EndFunc | ||
+ | ; GUI MESSAGE LOOP | ||
+ | GuiSetState() | ||
+ | ; Main Event Loop | ||
+ | While 1 | ||
+ | ; After every loop check if the user clicked something in the GUI window | ||
+ | $msg = GUIGetMsg() | ||
+ | if $process_results = True Then | ||
+ | if $poll_delay < TimerDiff($command_get_begin) Then | ||
+ | RunWait(@ComSpec & " /c " & "type arduino_log>results.txt", $network_dir,@SW_HIDE) | ||
+ | ; Load command results into Command Results tab | ||
+ | GuiCtrlSetData($edit_ctl_tab2, "------------------------------------------------------------------" & @CRLF,1) | ||
+ | GuiCtrlSetData($edit_ctl_tab2, "Command: " & GUICtrlRead($combo_ctl_search_file) & @CRLF,1) | ||
+ | GuiCtrlSetData($edit_ctl_tab2, "Results: " & @CRLF,1) | ||
+ | _Load_Results ($network_dir, $edit_ctl_tab2, "results.txt") | ||
+ | GuiCtrlSetData($edit_ctl_tab2, "******************************************************************" & @CRLF,1) | ||
+ | $process_results = False | ||
+ | RunWait(@ComSpec & " /c " & "echo>clear_log", $network_dir,@SW_HIDE) ; Send message to Linux polling script to clear the log | ||
+ | GUICtrlSetState ($processing, 0) | ||
+ | EndIf | ||
+ | EndIf | ||
+ | Select | ||
+ | ; Check if user clicked on the close button | ||
+ | Case $msg = $GUI_EVENT_CLOSE Or $msg = $exititem | ||
+ | ; Destroy the GUI including the controls | ||
+ | GUIDelete() | ||
+ | ; Exit the script | ||
+ | Exit | ||
+ | Case $msg = $infoitem | ||
+ | MsgBox(64, "Info", "Envrionmental Control v0.2" & @CRLF & "By: John Vaughters") | ||
+ | Case $msg = $status_btn | ||
+ | ; Start processing AVI | ||
+ | GUICtrlSetState ($processing, 1) | ||
+ | _GUICtrlEdit_SetSel ($edit_ctl_tab3, 0, -1) | ||
+ | _GUICtrlEdit_ReplaceSel ($edit_ctl_tab3, "") | ||
+ | _Load_Status_Messages () | ||
+ | _Send_Command ($working_dir, $network_dir, "S" ) | ||
+ | Sleep (2000) | ||
+ | RunWait(@ComSpec & " /c " & "type arduino_log>results.txt", $network_dir,@SW_HIDE) | ||
+ | _Load_Results ($network_dir, $edit_ctl_tab3, "results.txt") | ||
+ | RunWait(@ComSpec & " /c " & "echo>clear_log", $network_dir,@SW_HIDE) ; Send message to Linux polling script to clear the log | ||
+ | GUICtrlSetState ($processing, 0) | ||
+ | Case $msg = $set_time_btn ; Set the date/time on the RTC 1307 chip | ||
+ | $strTime = _Date_Time_GetLocalTime() | ||
+ | $Time_ary = _Date_Time_SystemTimeToArray($strTime) | ||
+ | GuiCtrlSetData($edit_ctl_tab2, "B" & StringFormat("%02d%02d%02d%1d%02d%02d%02d", $Time_ary[5], $Time_ary[4], $Time_ary[3], $Time_ary[7], $Time_ary[1], $Time_ary[0], StringTrimLeft($Time_ary[2], 2)) & @CRLF,1) | ||
+ | _Load_Status_Messages () | ||
+ | _Send_Command ($working_dir, $network_dir, "B" & StringFormat("%02d%02d%02d%1d%02d%02d%02d", $Time_ary[5], $Time_ary[4], $Time_ary[3], $Time_ary[7], $Time_ary[1], $Time_ary[0], StringTrimLeft($Time_ary[2], 2)) ) | ||
+ | Case $msg = $fan_btn | ||
+ | ; Toggle ON/OFF State | ||
+ | if GUICtrlRead($fan_btn) = "Fan ON" Then | ||
+ | GUICtrlSetData ($fan_btn, "Fan OFF") | ||
+ | _Send_Command ($working_dir, $network_dir, "F1" ) | ||
+ | ElseIf GUICtrlRead($fan_btn) = "Fan OFF" Then | ||
+ | GUICtrlSetData ($fan_btn, "Fan ON") | ||
+ | _Send_Command ($working_dir, $network_dir, "F0" ) | ||
+ | EndIf | ||
+ | Case $msg = $ac_btn | ||
+ | ; Toggle ON/OFF State | ||
+ | if GUICtrlRead($ac_btn) = "A/C ON" Then | ||
+ | GUICtrlSetData ($ac_btn, "A/C OFF") | ||
+ | _Send_Command ($working_dir, $network_dir, "A1" ) | ||
+ | ElseIf GUICtrlRead($ac_btn) = "A/C OFF" Then | ||
+ | GUICtrlSetData ($ac_btn, "A/C ON") | ||
+ | _Send_Command ($working_dir, $network_dir, "A0" ) | ||
+ | EndIf | ||
+ | Case $msg = $temp1_btn | ||
+ | ; Start processing AVI | ||
+ | GUICtrlSetState ($processing, 1) | ||
+ | _Load_Status_Messages () | ||
+ | _Send_Command ($working_dir, $network_dir, "T1D10" ) | ||
+ | Sleep (3000) | ||
+ | RunWait(@ComSpec & " /c " & "type arduino_log>results.txt", $network_dir,@SW_HIDE) | ||
+ | $file = FileOpen($network_dir & "results.txt", 0) | ||
+ | If $file = -1 Then | ||
+ | MsgBox(0, "Error", "Unable to open file.") | ||
+ | Exit | ||
+ | EndIf | ||
+ | GuiCtrlSetData($ctl_temp1_lbl, FileReadLine($file,2)) | ||
+ | GuiCtrlSetData($ctl_thresh1_lbl, FileReadLine($file,3)) | ||
+ | FileClose($file) | ||
+ | RunWait(@ComSpec & " /c " & "del " & "results.txt", $network_dir & "",@SW_HIDE) | ||
+ | RunWait(@ComSpec & " /c " & "echo>clear_log", $network_dir,@SW_HIDE) ; Send message to Linux polling script to clear the log | ||
+ | GUICtrlSetState ($processing, 0) | ||
+ | Case $msg = $temp2_btn | ||
+ | ; Start processing AVI | ||
+ | GUICtrlSetState ($processing, 1) | ||
+ | _Load_Status_Messages () | ||
+ | _Send_Command ($working_dir, $network_dir, "T2D20" ) | ||
+ | Sleep (3000) | ||
+ | RunWait(@ComSpec & " /c " & "type arduino_log>results.txt", $network_dir,@SW_HIDE) | ||
+ | $file = FileOpen($network_dir & "results.txt", 0) | ||
+ | If $file = -1 Then | ||
+ | MsgBox(0, "Error", "Unable to open file.") | ||
+ | Exit | ||
+ | EndIf | ||
+ | GuiCtrlSetData($ctl_temp2_lbl, FileReadLine($file,2)) | ||
+ | GuiCtrlSetData($ctl_thresh2_lbl, FileReadLine($file,3)) | ||
+ | FileClose($file) | ||
+ | RunWait(@ComSpec & " /c " & "del " & "results.txt", $network_dir & "",@SW_HIDE) | ||
+ | RunWait(@ComSpec & " /c " & "echo>clear_log", $network_dir,@SW_HIDE) ; Send message to Linux polling script to clear the log | ||
+ | GUICtrlSetState ($processing, 0) | ||
+ | Case $msg = $temp3_btn | ||
+ | ; Start processing AVI | ||
+ | GUICtrlSetState ($processing, 1) | ||
+ | _Load_Status_Messages () | ||
+ | _Send_Command ($working_dir, $network_dir, "T3D30" ) | ||
+ | Sleep (3000) | ||
+ | RunWait(@ComSpec & " /c " & "type arduino_log>results.txt", $network_dir,@SW_HIDE) | ||
+ | $file = FileOpen($network_dir & "results.txt", 0) | ||
+ | If $file = -1 Then | ||
+ | MsgBox(0, "Error", "Unable to open file.") | ||
+ | Exit | ||
+ | EndIf | ||
+ | GuiCtrlSetData($ctl_temp3_lbl, FileReadLine($file,2)) | ||
+ | GuiCtrlSetData($ctl_thresh3_lbl, FileReadLine($file,3)) | ||
+ | FileClose($file) | ||
+ | RunWait(@ComSpec & " /c " & "del " & "results.txt", $network_dir & "",@SW_HIDE) | ||
+ | RunWait(@ComSpec & " /c " & "echo>clear_log", $network_dir,@SW_HIDE) ; Send message to Linux polling script to clear the log | ||
+ | GUICtrlSetState ($processing, 0) | ||
+ | Case $msg = $temp4_btn | ||
+ | ; Start processing AVI | ||
+ | GUICtrlSetState ($processing, 1) | ||
+ | _Load_Status_Messages () | ||
+ | _Send_Command ($working_dir, $network_dir, "T4D40" ) | ||
+ | Sleep (3000) | ||
+ | RunWait(@ComSpec & " /c " & "type arduino_log>results.txt", $network_dir,@SW_HIDE) | ||
+ | $file = FileOpen($network_dir & "results.txt", 0) | ||
+ | If $file = -1 Then | ||
+ | MsgBox(0, "Error", "Unable to open file.") | ||
+ | Exit | ||
+ | EndIf | ||
+ | GuiCtrlSetData($ctl_temp4_lbl, FileReadLine($file,2)) | ||
+ | GuiCtrlSetData($ctl_thresh4_lbl, FileReadLine($file,3)) | ||
+ | FileClose($file) | ||
+ | RunWait(@ComSpec & " /c " & "del " & "results.txt", $network_dir & "",@SW_HIDE) | ||
+ | RunWait(@ComSpec & " /c " & "echo>clear_log", $network_dir,@SW_HIDE) ; Send message to Linux polling script to clear the log | ||
+ | GUICtrlSetState ($processing, 0) | ||
+ | Case $msg = $poll_btn ; Eventually this should be a toggle button to poll data every certian period of time | ||
+ | ; Start processing AVI | ||
+ | GUICtrlSetState ($processing, 1) | ||
+ | _Load_Status_Messages () | ||
+ | _Send_Command ($working_dir, $network_dir, "T1T2T3T4D10D20D30D40" ) | ||
+ | Sleep (9000) | ||
+ | RunWait(@ComSpec & " /c " & "type arduino_log>results.txt", $network_dir,@SW_HIDE) | ||
+ | $file = FileOpen($network_dir & "results.txt", 0) | ||
+ | If $file = -1 Then | ||
+ | MsgBox(0, "Error", "Unable to open file.") | ||
+ | Exit | ||
+ | EndIf | ||
+ | GuiCtrlSetData($ctl_temp1_lbl, FileReadLine($file,2)) | ||
+ | GuiCtrlSetData($ctl_temp2_lbl, FileReadLine($file,3)) | ||
+ | GuiCtrlSetData($ctl_temp3_lbl, FileReadLine($file,4)) | ||
+ | GuiCtrlSetData($ctl_temp4_lbl, FileReadLine($file,5)) | ||
+ | GuiCtrlSetData($ctl_thresh1_lbl, FileReadLine($file,6)) | ||
+ | GuiCtrlSetData($ctl_thresh2_lbl, FileReadLine($file,7)) | ||
+ | GuiCtrlSetData($ctl_thresh3_lbl, FileReadLine($file,8)) | ||
+ | GuiCtrlSetData($ctl_thresh4_lbl, FileReadLine($file,9)) | ||
+ | FileClose($file) | ||
+ | RunWait(@ComSpec & " /c " & "del " & "results.txt", $network_dir & "",@SW_HIDE) | ||
+ | RunWait(@ComSpec & " /c " & "echo>clear_log", $network_dir,@SW_HIDE) ; Send message to Linux polling script to clear the log | ||
+ | GUICtrlSetState ($processing, 0) | ||
+ | Case $msg = $search_btn | ||
+ | ; Start processing AVI | ||
+ | GUICtrlSetState ($processing, 1) | ||
+ | $file = FileOpen($working_dir & "command", 2) | ||
+ | ; Check if file opened for reading OK | ||
+ | If $file = -1 Then | ||
+ | MsgBox(0, "Error", "Unable to open file.") | ||
+ | Exit | ||
+ | EndIf | ||
+ | ; Set File Type | ||
+ | $working_file = GUICtrlRead($combo_ctl_search_file) | ||
+ | FileWrite($file, $working_file) | ||
+ | FileClose($file) ; The File must be closed before you can copy it anywhere | ||
+ | RunWait(@ComSpec & " /c " & "copy command " & $network_dir, $working_dir,@SW_HIDE) | ||
+ | $command_get_begin = TimerInit() ;Start the timer until you can retrieve your results | ||
+ | $process_results = True ; Set Processing flag | ||
+ | Case $msg = $site_btn | ||
+ | _IECreate ("www.combustory.com") | ||
+ | Case $msg = $clear_btn | ||
+ | _GUICtrlEdit_SetSel ($edit_ctl_tab2, 0, -1) | ||
+ | _GUICtrlEdit_ReplaceSel ($edit_ctl_tab2, "") | ||
+ | EndSelect | ||
+ | WEnd | ||
</pre> | </pre> | ||
Line 424: | Line 937: | ||
When Troubleshooting a multi-functional issue, it is best practice to break down the issue into pieces and test each piece as a separate system. However, we will first run through a quick test to see if we can find any obvious issues first. | When Troubleshooting a multi-functional issue, it is best practice to break down the issue into pieces and test each piece as a separate system. However, we will first run through a quick test to see if we can find any obvious issues first. | ||
=== Quick Test === | === Quick Test === | ||
+ | [[Category:Electronics]] |
Latest revision as of 19:31, 29 January 2011
Welcome to Combustory
Any questions or comments:
- Send them to - combustor@combustory.com
|
Warning
This page is in progress and none of the code can be considered good or complete. I am just using this as an alternate storage of the code for right now.
Summary
Functional Description of the Method
Requirements
Example of Method
Quick Guide:
Detailed Guide:
I2C
X9241A - Digital Potentiometer
Detail on this page X9241A - Digital Potentiometer
There are basically only two functions that I am after right now which are both three byte instructions:
- Read WCR(Wiper Control Register) for the four potentiometers 0-3 (So far this is failing miserably)
- Send 1st byte - Address (my circuit - 01011010 or 0x2D)(binary - 0101 A3 A2 A1 A0) A values are actual pins set to high or low for an address.
- Send 2nd byte - Instruction (binary - 1001 (1/0)(1/0) 00) - The two bits are used to choose the potentiometer
- Read WCR requested Byte
- Write WCR for the four potentiometers 0-3 (This works)
- Send 1st byte - Address (my circuit - 01011010 or 0x2D)(binary - 0101 A3 A2 A1 A0) A values are actual pins set to high or low for an address.
- Send 2nd byte - Instruction (binary - 1010 (1/0)(1/0) 00) - The two bits are used to choose the potentiometer
- Send WCR Byte - Potentiometer value (binary - 00 D5 D4 D3 D2 D1 D0) - D values are the 0-63 potentiometer positions
Sample Code
Wire.beginTransmission(X9241_I2C_ADDRESS); Wire.send(0xa0); //Instruction to write WCR-00 Wire.send(0x20); //Send a D value of 32 Wire.endTransmission();
DS1307 - Real Time Clock
The code for this very useful chip came from the RTC1307 - Real Time Clock
A/C_Control_v.01 code for Arduino
While this says v.01, don't count on it being a released v.01, I am still working on v.01, this is a back up
/* * A/C Control v.01 * by <http://www.combustory.com> John Vaughters * Credit to: * Maurice Ribble - http://www.glacialwanderer.com/hobbyrobotics for RTC DS1307 code * * Turns on an LED for temperatures from analog pins 1-5 on * digital pins 2-6 when the temperature rises above the THRESHOLDS 1-5. * The program also implements a * Serial Communication method that utilizes a leading CHAR for each command Described below. * Commands: * T(1-4) - Temp1-5 Status ex. T1, T2, etc * C(1-4)(0-9) - Increment THRESHOLD1-4 by (1-9) ex. C15 increments THRESHOLD1 BY 5 (Note: C40 will give you a status of THRESHOLD4) * D(1-4)(0-9) - Decrement THRESHOLD1-4 by (1-9) ex. D59 decrements THRESHOLD5 BY 9 (Note: D10 will give you a status of THRESHOLD1) * A(0-1) - Manual AC on command A1 is AC on, A0 is AC off * F(0-1) - Manual AC on command A1 is FAN on, A0 is FAN off * B(00-59)(00-59)(00-23)(1-7)(01-31)(01-12)(00-99) - B(sec)(min)(hour)(dayOfWeek)(dayOfMonth)(month)(year) - B Sets the date of the RTC DS1307 Chip. ex. B1157193040209 * R(0-4) - Need to Define this better it is for transferring X9241 registers * S - System Status * Q(1-2) - (1) Memory initialize (2) RTC - Memory Dump */ #include <math.h> #include "Wire.h" #define DS1307_I2C_ADDRESS 0x68 #define X9241_I2C_ADDRESS 0x2D // Global Variables int val_cnt = 0; // counter for the temp_val int temp1Pin = 0; // select the input pin for the Thermistor int temp2Pin = 1; // select the input pin for the Thermistor int temp3Pin = 2; // select the input pin for the Thermistor int temp4Pin = 3; // select the input pin for the Thermistor int temp1_val[5] = {0,0,0,0,0}; // variable to store the value coming from the sensor int temp2_val[5] = {0,0,0,0,0}; // int temp3_val[5] = {0,0,0,0,0}; // int temp4_val[5] = {0,0,0,0,0}; // int temp1_avg; // average over poll time of the temp values int temp2_avg; int temp3_avg; int temp4_avg; int duct1 = 2; // Ducts open or close using a digital output int duct2 = 3; int duct3 = 4; int duct4 = 5; int THRESHOLD1 = 580; // Default theshold values int THRESHOLD2 = 580; int THRESHOLD3 = 580; int THRESHOLD4 = 580; int ac_on = 13; int fan_on = 12; int command = 0; // This is the command char, in ascii form, sent from the serial port int i; long polltime = 1000; // The time to Poll the tempPins long previousMillis = 0; // will store last time Temp was updated long ac_on_start = 0; // Start A/C delay timer long ac_on_delay = 10000; // Time to wait before checking the ducts again byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; byte test; // Convert normal decimal numbers to binary coded decimal byte decToBcd(byte val) { return ( (val/10*16) + (val%10) ); } // Convert binary coded decimal to normal decimal numbers byte bcdToDec(byte val) { return ( (val/16*10) + (val%16) ); } // 1) Sets the date and time on the ds1307 // 2) Starts the clock // 3) Sets hour mode to 24 hour clock // Assumes you're passing in valid numbers // Watch for scope issues with Global Variables // This function is ripe for bugs. Probably need to put in checks for valid numbers or the RTC will get hung up. void setDateDs1307() { second = (byte) ((Serial.read() - 48) * 10 + (Serial.read() - 48)); // Use of (byte) type casting and ascii math to achieve result. minute = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); hour = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); dayOfWeek = (byte) (Serial.read() - 48); dayOfMonth = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); month = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); year= (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48)); Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.send(0x00); Wire.send(decToBcd(second)); // 0 to bit 7 starts the clock Wire.send(decToBcd(minute)); Wire.send(decToBcd(hour)); // If you want 12 hour am/pm you need to set // bit 6 (also need to change readDateDs1307) Wire.send(decToBcd(dayOfWeek)); Wire.send(decToBcd(dayOfMonth)); Wire.send(decToBcd(month)); Wire.send(decToBcd(year)); Wire.endTransmission(); } // Gets the date and time from the ds1307 and prints result // Watch for scope issues with Global Variables void getDateDs1307() { // Reset the register pointer Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.send(0x00); Wire.endTransmission(); Wire.requestFrom(DS1307_I2C_ADDRESS, 7); // A few of these need masks because certain bits are control bits second = bcdToDec(Wire.receive() & 0x7f); minute = bcdToDec(Wire.receive()); hour = bcdToDec(Wire.receive() & 0x3f); // Need to change this if 12 hour am/pm dayOfWeek = bcdToDec(Wire.receive()); dayOfMonth = bcdToDec(Wire.receive()); month = bcdToDec(Wire.receive()); year = bcdToDec(Wire.receive()); Serial.print(hour, DEC); Serial.print(":"); Serial.print(minute, DEC); Serial.print(":"); Serial.print(second, DEC); Serial.print(" "); Serial.print(month, DEC); Serial.print("/"); Serial.print(dayOfMonth, DEC); Serial.print("/"); Serial.print(year, DEC); } double Thermister(int RawADC) { // Nice little Function found on the Arduino Playground to convert a Thermistor voltage to a Temp in F double Temp; Temp = log(((10240000/RawADC) - 10000)); Temp = 1 / (0.001129148 + (0.000234125 * Temp) + (0.0000000876741 * Temp * Temp * Temp)); Temp = Temp - 273.15; // Convert Kelvin to Celcius Temp = (Temp * 9.0)/ 5.0 + 32.0; // Convert Celcius to Fahrenheit return Temp; } void setup() { Wire.begin(); Serial.begin(57600); pinMode(duct1, OUTPUT); pinMode(duct2, OUTPUT); pinMode(duct3, OUTPUT); pinMode(duct4, OUTPUT); pinMode(ac_on, OUTPUT); pinMode(fan_on, OUTPUT); } void loop() { if (millis() - previousMillis > polltime) { previousMillis = millis(); // remember the last time if (millis() - ac_on_start > ac_on_delay) { if (digitalRead(duct1) || digitalRead(duct2) || digitalRead(duct3) || digitalRead(duct4)){ // If any ducts are turned on turn on the A/C if (digitalRead(ac_on) != HIGH) { // Check ac_on state digitalWrite(ac_on,HIGH); getDateDs1307(); Serial.println(" - AC ON"); } ac_on_start = millis(); } else if (digitalRead(ac_on) != LOW){ //Check ac_on state digitalWrite(ac_on,LOW); getDateDs1307(); Serial.println(" - AC OFF"); } } temp1_val[val_cnt] = analogRead(temp1Pin); // read the value from the sensors temp2_val[val_cnt] = analogRead(temp2Pin); temp3_val[val_cnt] = analogRead(temp3Pin); temp4_val[val_cnt] = analogRead(temp4Pin); val_cnt ++; if (val_cnt == 5) { val_cnt = 0; } temp1_avg = (temp1_val[0] + temp1_val[1] + temp1_val[2] + temp1_val[3] + temp1_val[4])/5; // Take 5 sec average of temperature temp2_avg = (temp2_val[0] + temp2_val[1] + temp2_val[2] + temp2_val[3] + temp2_val[4])/5; temp3_avg = (temp3_val[0] + temp3_val[1] + temp3_val[2] + temp3_val[3] + temp3_val[4])/5; temp4_avg = (temp4_val[0] + temp4_val[1] + temp4_val[2] + temp4_val[3] + temp4_val[4])/5; // Check Thresholds against the Temperatures and set the ducts HIGH or LOW if (temp1_avg >= THRESHOLD1) {digitalWrite(duct1, HIGH);} else {digitalWrite(duct1, LOW);} if (temp2_avg >= THRESHOLD2) {digitalWrite(duct2, HIGH);} else {digitalWrite(duct2, LOW);} if (temp3_avg >= THRESHOLD3) {digitalWrite(duct3, HIGH);} else {digitalWrite(duct3, LOW);} if (temp4_avg >= THRESHOLD4) {digitalWrite(duct4, HIGH);} else {digitalWrite(duct4, LOW);} if (Serial.available()) { // Look for char in serial que and process if found command = Serial.read(); if (command == 84) { // If command = "T" command = Serial.read(); if (command == 49) { // If command = "1" print the Temp1 Serial.print("Temp1 = "); Serial.print(int(Thermister(temp1_avg))); // Serial.print(" "); } else if (command == 50) { // If command = "2" print the Temp2 Serial.print("Temp2 = "); Serial.print(int(Thermister(temp2_avg))); // Serial.print(" "); } else if (command == 51) { // If command = "3" print the Temp3 Serial.print("Temp3 = "); Serial.print(int(Thermister(temp3_avg))); // Serial.print(" "); } else if (command == 52) { // If command = "4" print the Temp4 Serial.print("Temp4 = "); Serial.print(int(Thermister(temp4_avg))); // Serial.print(" "); } } else if (command == 67) { //If command = "C" Change Temp Threshhold if (Serial.available()) { command = Serial.read(); if (command == 49) { // If command = "1" print the THRESHOLD1 command = Serial.read(); if (command > 47 && command < 58) { // If command is between 0-9 Increment the Threshold by number sent THRESHOLD1 += command - 48; // ASCII math to get value sent Serial.print("THRESHOLD1 = "); Serial.print(int(Thermister(THRESHOLD1))); // Serial.print(" "); } } else if (command == 50) { // If command = "2" print the THRESHOLD2 command = Serial.read(); if (command > 47 && command < 58) { // If command is between 0-9 Increment the Threshold by number sent THRESHOLD2 += command - 48; // ASCII math to get value sent Serial.print("THRESHOLD2 = "); Serial.print(int(Thermister(THRESHOLD2))); // Serial.print(" "); } } else if (command == 51) { // If command = "3" print the THRESHOLD3 command = Serial.read(); if (command > 47 && command < 58) { // If command is between 0-9 Increment the Threshold by number sent THRESHOLD3 += command - 48; // ASCII math to get value sent Serial.print("THRESHOLD3 = "); Serial.print(int(Thermister(THRESHOLD3))); // Serial.print(" "); } } else if (command == 52) { // If command = "4" print the THRESHOLD4 command = Serial.read(); if (command > 47 && command < 58) { // If command is between 0-9 Increment the Threshold by number sent THRESHOLD4 += command - 48; // ASCII math to get value sent Serial.print("THRESHOLD4 = "); Serial.print(int(Thermister(THRESHOLD4))); // Serial.print(" "); } } } } else if (command == 68) { //If command = "D" Change Temp Threshhold if (Serial.available()) { command = Serial.read(); if (command == 49) { // If command = "1" print the THRESHOLD1 command = Serial.read(); if (command > 47 && command < 58) { // If command is between 0-9 Decrement the Threshold by number sent THRESHOLD1 -= command - 48; // ASCII math to get value sent Serial.print("THRESHOLD1 = "); Serial.print(int(Thermister(THRESHOLD1))); // Serial.print(" "); } } else if (command == 50) { // If command = "2" print the THRESHOLD2 command = Serial.read(); if (command > 47 && command < 58) { // If command is between 0-9 Decrement the Threshold by number sent THRESHOLD2 -= command - 48; // ASCII math to get value sent Serial.print("THRESHOLD2 = "); Serial.print(int(Thermister(THRESHOLD2))); // Serial.print(" "); } } else if (command == 51) { // If command = "3" print the THRESHOLD3 command = Serial.read(); if (command > 47 && command < 58) { // If command is between 0-9 Decrement the Threshold by number sent THRESHOLD3 -= command - 48; // ASCII math to get value sent Serial.print("THRESHOLD3 = "); Serial.print(int(Thermister(THRESHOLD3))); // Serial.print(" "); } } else if (command == 52) { // If command = "4" print the THRESHOLD4 command = Serial.read(); if (command > 47 && command < 58) { // If command is between 0-9 Decrement the Threshold by number sent THRESHOLD4 -= command - 48; // ASCII math to get value sent Serial.print("THRESHOLD4 = "); Serial.print(int(Thermister(THRESHOLD4))); // Serial.print(" "); } } } } //**************** Warning - This is a potential for problem - Consider a manual lock out feature to lock out manual commands //**************** Possibly create a command to open up manual commands for a certian time period then shut them off again automatically else if (command == 65) { //If command = "A" Change Temp Threshhold if (Serial.available()) { command = Serial.read(); if (command == 49) { // If command = "1" print the AC ON message getDateDs1307(); Serial.print(" - Manual AC ON "); ac_on_start = millis(); // Set the AC to a delay before it can be turned off again digitalWrite(ac_on,HIGH); } else if (command == 48) { // If command = "0" print the AC OFF message getDateDs1307(); Serial.print(" - Manual AC OFF "); digitalWrite(ac_on,LOW); } } } else if (command == 70) { //If command = "F" Change Temp Threshhold if (Serial.available()) { command = Serial.read(); if (command == 49) { // If command = "1" print the FAN ON message getDateDs1307(); Serial.print(" - Manual FAN ON "); ac_on_start = millis(); digitalWrite(fan_on,HIGH); } else if (command == 48) { // If command = "0" print the FAN OFF message getDateDs1307(); Serial.print(" - Manual FAN OFF "); digitalWrite(fan_on,LOW); } } } //********************** End of Warning Zone ******************************* // *************** This Section Will list the Staus of the Controller else if (command == 83) { //If command = "S" Print Controller Status getDateDs1307(); Serial.println(" "); Serial.println(" "); Serial.print("Temp1 = "); Serial.println(int(Thermister(temp1_avg))); Serial.print("Temp2 = "); Serial.println(int(Thermister(temp2_avg))); Serial.print("Temp3 = "); Serial.println(int(Thermister(temp3_avg))); Serial.print("Temp4 = "); Serial.println(int(Thermister(temp4_avg))); Serial.println(" "); Serial.print("THRESHOLD1 = "); Serial.println(int(Thermister(THRESHOLD1))); Serial.print("THRESHOLD2 = "); Serial.println(int(Thermister(THRESHOLD2))); Serial.print("THRESHOLD3 = "); Serial.println(int(Thermister(THRESHOLD3))); Serial.print("THRESHOLD4 = "); Serial.println(int(Thermister(THRESHOLD4))); Serial.println(" "); if (digitalRead(duct1) == HIGH) {Serial.println("duct1 ON");} else{Serial.println("duct1 OFF");} if (digitalRead(duct2) == HIGH) {Serial.println("duct2 ON");} else{Serial.println("duct2 OFF");} if (digitalRead(duct3) == HIGH) {Serial.println("duct3 ON");} else{Serial.println("duct3 OFF");} if (digitalRead(duct4) == HIGH) {Serial.println("duct4 ON");} else{Serial.println("duct4 OFF");} Serial.println(" "); if (digitalRead(fan_on) == HIGH) {Serial.println("Fan ON");} else{Serial.println("Fan OFF");} if (digitalRead(ac_on) == HIGH) {Serial.println("AC ON");} else{Serial.println("AC OFF");} Serial.print("A/C Delay (millisec) = "); Serial.println(ac_on_delay); Serial.print("Temp Polling (millisec) = "); Serial.println(polltime); Serial.println(" "); } else if (command == 66) { //If command = "B" Set Date setDateDs1307(); getDateDs1307(); Serial.println(" "); } else if (command == 81) { //If command = "Q" RTC1307 Functions // Wire.beginTransmission(DS1307_I2C_ADDRESS); // Wire.send(0x0f); // Wire.send(0xff); // Wire.endTransmission(); if (Serial.available()) { command = Serial.read(); if (command == 49) { //If command = "1" RTC1307 Initialize Memory - All Data will be set to 1. Therefore 1 or 0 will not be a valid value. Wire.beginTransmission(DS1307_I2C_ADDRESS); // 1 will be the init value and 0 will be cosidered an error that occurs when the RTC is in Battery mode. Wire.send(0x08); for (i = 1; i <= 27; i++) { Wire.send(0xff); delay(100); } Wire.endTransmission(); getDateDs1307(); Serial.println(": RTC1307 Initialized Memory"); } else if (command == 50) { //If command = "2" RTC1307 Memory Dump getDateDs1307(); Serial.println(": RTC 1307 Dump Begin"); Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.send(0x00); Wire.endTransmission(); Wire.requestFrom(DS1307_I2C_ADDRESS, 65); for (i = 1; i <= 65; i++) { test = Wire.receive(); Serial.print(i); Serial.print(":"); Serial.println(test, DEC); } Wire.endTransmission(); Serial.println(" RTC1307 Dump end"); } } } else if (command == 82) { //If command = "R" Set Duct Position if (Serial.available()) { command = Serial.read(); // This code sets up the Persistent Registers and is not necessarily needed all the time, so can be removed from program eventually if (command == 49) { // If command = "1" Wire.beginTransmission(X9241_I2C_ADDRESS); Wire.send(0xc0); // This is the set register command c and the 16 registers are 0-f Wire.send(0x0a); // This line is the value to set the register Wire.endTransmission(); delay(100); Wire.beginTransmission(X9241_I2C_ADDRESS); Wire.send(0xc1); Wire.send(0x14); Wire.endTransmission(); delay(100); Wire.beginTransmission(X9241_I2C_ADDRESS); Wire.send(0xc2); Wire.send(0x20); Wire.endTransmission(); delay(100); Wire.beginTransmission(X9241_I2C_ADDRESS); Wire.send(0xc3); Wire.send(0x3c); Wire.endTransmission(); delay(100); Wire.beginTransmission(X9241_I2C_ADDRESS); Wire.send(0xc4); Wire.send(0x0a); Wire.endTransmission(); delay(100); Wire.beginTransmission(X9241_I2C_ADDRESS); Wire.send(0xc5); Wire.send(0x14); Wire.endTransmission(); delay(100); Wire.beginTransmission(X9241_I2C_ADDRESS); Wire.send(0xc6); Wire.send(0x20); Wire.endTransmission(); delay(100); Wire.beginTransmission(X9241_I2C_ADDRESS); Wire.send(0xc7); Wire.send(0x3c); delay(100); Wire.beginTransmission(X9241_I2C_ADDRESS); Wire.send(0xc8); Wire.send(0x0a); Wire.endTransmission(); delay(100); Wire.beginTransmission(X9241_I2C_ADDRESS); Wire.send(0xc9); Wire.send(0x14); Wire.endTransmission(); delay(100); Wire.beginTransmission(X9241_I2C_ADDRESS); Wire.send(0xca); Wire.send(0x20); Wire.endTransmission(); delay(100); Wire.beginTransmission(X9241_I2C_ADDRESS); Wire.send(0xcb); Wire.send(0x3c); Wire.endTransmission(); delay(100); Wire.beginTransmission(X9241_I2C_ADDRESS); Wire.send(0xcc); Wire.send(0x0a); Wire.endTransmission(); delay(100); Wire.beginTransmission(X9241_I2C_ADDRESS); Wire.send(0xcd); Wire.send(0x14); Wire.endTransmission(); delay(100); Wire.beginTransmission(X9241_I2C_ADDRESS); Wire.send(0xce); Wire.send(0x20); Wire.endTransmission(); delay(100); Wire.beginTransmission(X9241_I2C_ADDRESS); Wire.send(0xcf); Wire.send(0x3c); Wire.endTransmission(); } else if (command == 50) { // If command = "2" Wire.beginTransmission(X9241_I2C_ADDRESS); Wire.send(0x10); // Global Load WCR's with Reg-00 Wire.endTransmission(); } else if (command == 51) { // If command = "3" Wire.beginTransmission(X9241_I2C_ADDRESS); Wire.send(0x11); // Global Load WCR's with Reg-01 Wire.endTransmission(); } else if (command == 52) { // If command = "4" Wire.beginTransmission(X9241_I2C_ADDRESS); Wire.send(0x12); // Global Load WCR's with Reg-10 Wire.endTransmission(); } else if (command == 53) { // If command = "5" Wire.beginTransmission(X9241_I2C_ADDRESS); Wire.send(0x13); // Global Load WCR's with Reg-11 Wire.endTransmission(); } } //*********** Read operation just not working :~( //Wire.beginTransmission(X9241_I2C_ADDRESS); //Wire.send(0x90); //Serial.println("made it 1"); // Wire.endTransmission(); //Serial.println(test, DEC); //Wire.beginTransmission(X9241_I2C_ADDRESS); //Wire.requestFrom(X9241_I2C_ADDRESS, 1); //Wire.send(0x90); //Serial.println("made it 2"); //test = bcdToDec(Wire.receive()); //test = Wire.receive(); //Serial.println(test, DEC); //Serial.println(Wire.available()); //Wire.endTransmission(); //Serial.println(test, DEC); } Serial.println(command); // Echo command char found in serial que command = 0; // reset command } } } //*****************************************************The End***********************
A/C_Control_v.02 code for AutoIT
While this says v.02, don't count on it being a released v.02, I am still working on v.02, this is a back up
; Arduino Communications and Control ; 2 Sep 2008 - John Vaughters <http://www.combustory.com> ; This is a Utility to Communicate with the Arduino Control board for managing the Home Environment #include <WindowsConstants.au3> #include <GuiConstants.au3> #include <GuiEdit.au3> #include <file.au3> #include <Date.au3> #include <IE.au3> ;Initialize Variable Defaults $working_dir = @DesktopDir & "\" $working_file = "arduino_log" $poll_delay = 5000 ; This is the delay the program waits before collecting the command results ;$network_dir = "P:\sketchbook\ArduinoSerial\" $network_dir = "S:\" ; Change this to default before you release the SW $process_results = False ;Processing Flag $command_get_begin = TimerInit() ;Initialize Timer ; GUI GuiCreate(" A/C Control", 700, 600) ; MENU $filemenu = GuiCtrlCreateMenu("&File") $fileitem = GUICtrlCreateMenuitem ("Open",$filemenu) GUICtrlSetState(-1,$GUI_DEFBUTTON) $exititem = GUICtrlCreateMenuitem ("Exit",$filemenu) $helpmenu = GuiCtrlCreateMenu("Help") $infoitem = GUICtrlCreateMenuitem ("Info",$helpmenu) ; LOGO PIC GuiCtrlCreatePic("logo.jpg",0,0, 100,140) ; AVI for letting the user know the system is processing $processing = GuiCtrlCreateAvi("sampleAVI.avi",0, 405, 140, 32, 32) ; Tabbed Result Window $tab_result_start_x = 20 $tab_result_start_y = 175 $tab_result_size_x = 650 $tab_result_size_y = 400 $tab_result_title_2 = "Command Results" $tab_result_title_3 = "Status" $tab_result_title_4 = "Sys Info" GuiCtrlCreateTab($tab_result_start_x, $tab_result_start_y, $tab_result_size_x , $tab_result_size_y) GuiCtrlCreateTabItem($tab_result_title_2) $edit_ctl_tab2 = GuiCtrlCreateEdit(@CRLF & "", $tab_result_start_x + 10 , $tab_result_start_y + 40, $tab_result_size_x - 20, $tab_result_size_y - 50) GuiCtrlCreateTabItem($tab_result_title_3) $edit_ctl_tab3 = GuiCtrlCreateEdit(@CRLF & "", $tab_result_start_x + 10 , $tab_result_start_y + 40, $tab_result_size_x - 20, $tab_result_size_y - 50) GuiCtrlCreateTabItem($tab_result_title_4) $edit_ctl_tab4 = GuiCtrlCreateEdit(@CRLF & "", $tab_result_start_x + 10 , $tab_result_start_y + 40, $tab_result_size_x - 20, $tab_result_size_y - 50) GuiCtrlCreateTabItem("") ; Combo Arduino Command File Type $combo_ctl_search_file = GuiCtrlCreatecombo("C10", 240, 145, 120, 100) GUICtrlSetData(-1,"C15|D15|T1|","C10") ; add other item snd set a new default GuiCtrlCreateLabel("Custom Command", 245, 170, 150, 20) ; Temp Labels $ctl_temp1_lbl = GuiCtrlCreateLabel("", 180, 25, 100, 22,$WS_DLGFRAME) GUICtrlSetBkColor(-1,0xffffff) $ctl_temp2_lbl = GuiCtrlCreateLabel("", 180, 50, 100, 22,$WS_DLGFRAME) GUICtrlSetBkColor(-1,0xffffff) $ctl_temp3_lbl = GuiCtrlCreateLabel("", 180, 75, 100, 22,$WS_DLGFRAME) GUICtrlSetBkColor(-1,0xffffff) $ctl_temp4_lbl = GuiCtrlCreateLabel("", 180, 100, 100, 22,$WS_DLGFRAME) GUICtrlSetBkColor(-1,0xffffff) $ctl_thresh1_lbl = GuiCtrlCreateLabel("", 300, 25, 150, 22,$WS_DLGFRAME) GUICtrlSetBkColor(-1,0xffffff) $ctl_thresh2_lbl = GuiCtrlCreateLabel("", 300, 50, 150, 22,$WS_DLGFRAME) GUICtrlSetBkColor(-1,0xffffff) $ctl_thresh3_lbl = GuiCtrlCreateLabel("", 300, 75, 150, 22,$WS_DLGFRAME) GUICtrlSetBkColor(-1,0xffffff) $ctl_thresh4_lbl = GuiCtrlCreateLabel("", 300, 100, 150, 22,$WS_DLGFRAME) GUICtrlSetBkColor(-1,0xffffff) ; Current Network Directory Label ;$combo_ctl_network_dir = GuiCtrlCreateLabel($network_dir, 240, 20, 450, 22,$WS_DLGFRAME) ;GUICtrlSetBkColor(-1,0xffffff) ;GuiCtrlCreateLabel("Network Directory", 245, 45, 200, 20) ; BUTTON $search_btn = GuiCtrlCreateButton("Go", 370, 143, 25, 25) ;$file_btn = GuiCtrlCreateButton("Working Dir", 125, 77, 100, 25) ;$network_btn = GuiCtrlCreateButton("Network Dir", 125, 18, 100, 25) $site_btn = GuiCtrlCreateButton("www.combustory.com", 0, 145, 135, 22) $clear_btn = GuiCtrlCreateButton("Clear", 620, 170, 50, 22) $temp1_btn = GuiCtrlCreateButton("Temp 1", 120, 25, 50, 22) $temp2_btn = GuiCtrlCreateButton("Temp 2", 120, 50, 50, 22) $temp3_btn = GuiCtrlCreateButton("Temp 3", 120, 75, 50, 22) $temp4_btn = GuiCtrlCreateButton("Temp 4", 120, 100, 50, 22) $poll_btn = GuiCtrlCreateButton("Poll", 120, 0, 50, 22) $ac_btn = GuiCtrlCreateButton("A/C ON", 500, 75, 60, 22) $fan_btn = GuiCtrlCreateButton("Fan ON", 500, 100, 60, 22) $status_btn = GuiCtrlCreateButton("Status", 500, 125, 60, 22) $set_time_btn = GuiCtrlCreateButton("Set Time", 500, 150, 60, 22) ; List System Info GuiCtrlSetData($edit_ctl_tab4, "Computer: " & @CRLF & _ "----------------------------------------------------------" & @CRLF & _ "IP Address: " & @IPAddress1 & @CRLF & _ "Computer Name: " & @ComputerName & @CRLF & _ "OS: " & @OSVersion & @CRLF & _ "Sys Dir: " & @SystemDir & @CRLF & @CRLF) ;************* ; _Load_Results() loads the temp file into the desired control then deletes the temp file ; $w_dir is the working directory where the file exists ; $ctl_to_load is the place to load the file contents ; $temp_file is the temporary file to load the data from ; The function returns the number of lines loaded from the file or a zero for a failure Func _Load_Results ($w_dir, $ctl_load_to, $temp_file) Dim $aRecords If Not _FileReadToArray($w_dir & $temp_file,$aRecords) Then Return (0) ; Failure to read a file EndIf For $x = 1 to $aRecords[0] if StringLen($aRecords[$x]) > 0 then GuiCtrlSetData($ctl_load_to, $aRecords[$x] & @CRLF, 1) Next ;Delete the temporary file RunWait(@ComSpec & " /c " & "del " & $temp_file, $w_dir & "",@SW_HIDE) Return ($aRecords[0]-1) EndFunc ;*********************** ; _Load_Status_Messages() loads the messages that were logged by the control board into the command window ; The variables seem to be global at this point, that should be changed though to make it a self contained func Func _Load_Status_Messages () RunWait(@ComSpec & " /c " & "type arduino_log>results.txt", $network_dir,@SW_HIDE) ; Load command results into Command Results tab GuiCtrlSetData($edit_ctl_tab2, "------------------------------------------------------------------" & @CRLF,1) GuiCtrlSetData($edit_ctl_tab2, "Status Messages: " & @CRLF,1) If Not _Load_Results ($network_dir, $edit_ctl_tab2, "results.txt") Then GuiCtrlSetData($edit_ctl_tab2, "No Status Messages! " & @CRLF,1) EndIf GuiCtrlSetData($edit_ctl_tab2, "******************************************************************" & @CRLF,1) RunWait(@ComSpec & " /c " & "echo>clear_log", $network_dir,@SW_HIDE) ; Send message to Linux polling script to clear the log Sleep (1000) EndFunc ;************* ; _Send_Command() Sends a command to the control board ; $w_dir is the working directory where the file exists ; $n_dir is the network directory where the to copy the command file ; $cmd is the command to send the control board Func _Send_Command ($w_dir, $n_dir, $cmd) $file = FileOpen($w_dir & "command", 2) ; Check if file opened OK If $file = -1 Then MsgBox(0, "Error", "Unable to open file.") Exit EndIf FileWrite($file, $cmd) FileClose($file) ; The File must be closed before you can copy it anywhere RunWait(@ComSpec & " /c " & "copy command " & $n_dir, $w_dir,@SW_HIDE) EndFunc ; GUI MESSAGE LOOP GuiSetState() ; Main Event Loop While 1 ; After every loop check if the user clicked something in the GUI window $msg = GUIGetMsg() if $process_results = True Then if $poll_delay < TimerDiff($command_get_begin) Then RunWait(@ComSpec & " /c " & "type arduino_log>results.txt", $network_dir,@SW_HIDE) ; Load command results into Command Results tab GuiCtrlSetData($edit_ctl_tab2, "------------------------------------------------------------------" & @CRLF,1) GuiCtrlSetData($edit_ctl_tab2, "Command: " & GUICtrlRead($combo_ctl_search_file) & @CRLF,1) GuiCtrlSetData($edit_ctl_tab2, "Results: " & @CRLF,1) _Load_Results ($network_dir, $edit_ctl_tab2, "results.txt") GuiCtrlSetData($edit_ctl_tab2, "******************************************************************" & @CRLF,1) $process_results = False RunWait(@ComSpec & " /c " & "echo>clear_log", $network_dir,@SW_HIDE) ; Send message to Linux polling script to clear the log GUICtrlSetState ($processing, 0) EndIf EndIf Select ; Check if user clicked on the close button Case $msg = $GUI_EVENT_CLOSE Or $msg = $exititem ; Destroy the GUI including the controls GUIDelete() ; Exit the script Exit Case $msg = $infoitem MsgBox(64, "Info", "Envrionmental Control v0.2" & @CRLF & "By: John Vaughters") Case $msg = $status_btn ; Start processing AVI GUICtrlSetState ($processing, 1) _GUICtrlEdit_SetSel ($edit_ctl_tab3, 0, -1) _GUICtrlEdit_ReplaceSel ($edit_ctl_tab3, "") _Load_Status_Messages () _Send_Command ($working_dir, $network_dir, "S" ) Sleep (2000) RunWait(@ComSpec & " /c " & "type arduino_log>results.txt", $network_dir,@SW_HIDE) _Load_Results ($network_dir, $edit_ctl_tab3, "results.txt") RunWait(@ComSpec & " /c " & "echo>clear_log", $network_dir,@SW_HIDE) ; Send message to Linux polling script to clear the log GUICtrlSetState ($processing, 0) Case $msg = $set_time_btn ; Set the date/time on the RTC 1307 chip $strTime = _Date_Time_GetLocalTime() $Time_ary = _Date_Time_SystemTimeToArray($strTime) GuiCtrlSetData($edit_ctl_tab2, "B" & StringFormat("%02d%02d%02d%1d%02d%02d%02d", $Time_ary[5], $Time_ary[4], $Time_ary[3], $Time_ary[7], $Time_ary[1], $Time_ary[0], StringTrimLeft($Time_ary[2], 2)) & @CRLF,1) _Load_Status_Messages () _Send_Command ($working_dir, $network_dir, "B" & StringFormat("%02d%02d%02d%1d%02d%02d%02d", $Time_ary[5], $Time_ary[4], $Time_ary[3], $Time_ary[7], $Time_ary[1], $Time_ary[0], StringTrimLeft($Time_ary[2], 2)) ) Case $msg = $fan_btn ; Toggle ON/OFF State if GUICtrlRead($fan_btn) = "Fan ON" Then GUICtrlSetData ($fan_btn, "Fan OFF") _Send_Command ($working_dir, $network_dir, "F1" ) ElseIf GUICtrlRead($fan_btn) = "Fan OFF" Then GUICtrlSetData ($fan_btn, "Fan ON") _Send_Command ($working_dir, $network_dir, "F0" ) EndIf Case $msg = $ac_btn ; Toggle ON/OFF State if GUICtrlRead($ac_btn) = "A/C ON" Then GUICtrlSetData ($ac_btn, "A/C OFF") _Send_Command ($working_dir, $network_dir, "A1" ) ElseIf GUICtrlRead($ac_btn) = "A/C OFF" Then GUICtrlSetData ($ac_btn, "A/C ON") _Send_Command ($working_dir, $network_dir, "A0" ) EndIf Case $msg = $temp1_btn ; Start processing AVI GUICtrlSetState ($processing, 1) _Load_Status_Messages () _Send_Command ($working_dir, $network_dir, "T1D10" ) Sleep (3000) RunWait(@ComSpec & " /c " & "type arduino_log>results.txt", $network_dir,@SW_HIDE) $file = FileOpen($network_dir & "results.txt", 0) If $file = -1 Then MsgBox(0, "Error", "Unable to open file.") Exit EndIf GuiCtrlSetData($ctl_temp1_lbl, FileReadLine($file,2)) GuiCtrlSetData($ctl_thresh1_lbl, FileReadLine($file,3)) FileClose($file) RunWait(@ComSpec & " /c " & "del " & "results.txt", $network_dir & "",@SW_HIDE) RunWait(@ComSpec & " /c " & "echo>clear_log", $network_dir,@SW_HIDE) ; Send message to Linux polling script to clear the log GUICtrlSetState ($processing, 0) Case $msg = $temp2_btn ; Start processing AVI GUICtrlSetState ($processing, 1) _Load_Status_Messages () _Send_Command ($working_dir, $network_dir, "T2D20" ) Sleep (3000) RunWait(@ComSpec & " /c " & "type arduino_log>results.txt", $network_dir,@SW_HIDE) $file = FileOpen($network_dir & "results.txt", 0) If $file = -1 Then MsgBox(0, "Error", "Unable to open file.") Exit EndIf GuiCtrlSetData($ctl_temp2_lbl, FileReadLine($file,2)) GuiCtrlSetData($ctl_thresh2_lbl, FileReadLine($file,3)) FileClose($file) RunWait(@ComSpec & " /c " & "del " & "results.txt", $network_dir & "",@SW_HIDE) RunWait(@ComSpec & " /c " & "echo>clear_log", $network_dir,@SW_HIDE) ; Send message to Linux polling script to clear the log GUICtrlSetState ($processing, 0) Case $msg = $temp3_btn ; Start processing AVI GUICtrlSetState ($processing, 1) _Load_Status_Messages () _Send_Command ($working_dir, $network_dir, "T3D30" ) Sleep (3000) RunWait(@ComSpec & " /c " & "type arduino_log>results.txt", $network_dir,@SW_HIDE) $file = FileOpen($network_dir & "results.txt", 0) If $file = -1 Then MsgBox(0, "Error", "Unable to open file.") Exit EndIf GuiCtrlSetData($ctl_temp3_lbl, FileReadLine($file,2)) GuiCtrlSetData($ctl_thresh3_lbl, FileReadLine($file,3)) FileClose($file) RunWait(@ComSpec & " /c " & "del " & "results.txt", $network_dir & "",@SW_HIDE) RunWait(@ComSpec & " /c " & "echo>clear_log", $network_dir,@SW_HIDE) ; Send message to Linux polling script to clear the log GUICtrlSetState ($processing, 0) Case $msg = $temp4_btn ; Start processing AVI GUICtrlSetState ($processing, 1) _Load_Status_Messages () _Send_Command ($working_dir, $network_dir, "T4D40" ) Sleep (3000) RunWait(@ComSpec & " /c " & "type arduino_log>results.txt", $network_dir,@SW_HIDE) $file = FileOpen($network_dir & "results.txt", 0) If $file = -1 Then MsgBox(0, "Error", "Unable to open file.") Exit EndIf GuiCtrlSetData($ctl_temp4_lbl, FileReadLine($file,2)) GuiCtrlSetData($ctl_thresh4_lbl, FileReadLine($file,3)) FileClose($file) RunWait(@ComSpec & " /c " & "del " & "results.txt", $network_dir & "",@SW_HIDE) RunWait(@ComSpec & " /c " & "echo>clear_log", $network_dir,@SW_HIDE) ; Send message to Linux polling script to clear the log GUICtrlSetState ($processing, 0) Case $msg = $poll_btn ; Eventually this should be a toggle button to poll data every certian period of time ; Start processing AVI GUICtrlSetState ($processing, 1) _Load_Status_Messages () _Send_Command ($working_dir, $network_dir, "T1T2T3T4D10D20D30D40" ) Sleep (9000) RunWait(@ComSpec & " /c " & "type arduino_log>results.txt", $network_dir,@SW_HIDE) $file = FileOpen($network_dir & "results.txt", 0) If $file = -1 Then MsgBox(0, "Error", "Unable to open file.") Exit EndIf GuiCtrlSetData($ctl_temp1_lbl, FileReadLine($file,2)) GuiCtrlSetData($ctl_temp2_lbl, FileReadLine($file,3)) GuiCtrlSetData($ctl_temp3_lbl, FileReadLine($file,4)) GuiCtrlSetData($ctl_temp4_lbl, FileReadLine($file,5)) GuiCtrlSetData($ctl_thresh1_lbl, FileReadLine($file,6)) GuiCtrlSetData($ctl_thresh2_lbl, FileReadLine($file,7)) GuiCtrlSetData($ctl_thresh3_lbl, FileReadLine($file,8)) GuiCtrlSetData($ctl_thresh4_lbl, FileReadLine($file,9)) FileClose($file) RunWait(@ComSpec & " /c " & "del " & "results.txt", $network_dir & "",@SW_HIDE) RunWait(@ComSpec & " /c " & "echo>clear_log", $network_dir,@SW_HIDE) ; Send message to Linux polling script to clear the log GUICtrlSetState ($processing, 0) Case $msg = $search_btn ; Start processing AVI GUICtrlSetState ($processing, 1) $file = FileOpen($working_dir & "command", 2) ; Check if file opened for reading OK If $file = -1 Then MsgBox(0, "Error", "Unable to open file.") Exit EndIf ; Set File Type $working_file = GUICtrlRead($combo_ctl_search_file) FileWrite($file, $working_file) FileClose($file) ; The File must be closed before you can copy it anywhere RunWait(@ComSpec & " /c " & "copy command " & $network_dir, $working_dir,@SW_HIDE) $command_get_begin = TimerInit() ;Start the timer until you can retrieve your results $process_results = True ; Set Processing flag Case $msg = $site_btn _IECreate ("www.combustory.com") Case $msg = $clear_btn _GUICtrlEdit_SetSel ($edit_ctl_tab2, 0, -1) _GUICtrlEdit_ReplaceSel ($edit_ctl_tab2, "") EndSelect WEnd
A/C_Control_v.01 User Guide
Commands
Troubleshooting
Summary
When Troubleshooting a multi-functional issue, it is best practice to break down the issue into pieces and test each piece as a separate system. However, we will first run through a quick test to see if we can find any obvious issues first.