:)
Dependencies: MbedJSONValue DebounceIn TextLCD USBDevice mbed WebSocketClient cc3000_hostdriver_mbedsocket Adafruit_LEDBackpack_2
main.cpp
- Committer:
- fil
- Date:
- 2014-11-25
- Revision:
- 6:d0a1eba7f943
- Parent:
- 5:03d75ad40d5e
- Child:
- 7:7fbe8dc5e4fa
File content as of revision 6:d0a1eba7f943:
#include "mbed.h" #include <string> #include "Adafruit_LEDBackpack.h" #include "Adafruit_GFX.h" #include "TextLCD.h" #include "DebounceIn.h" #include "USBKeyboard.h" #include "cc3000.h" #include "Websocket.h" #include "MbedJSONValue.h" //LED stuff I2C i2c(D7,D6); Adafruit_24bargraph ledbar_left=Adafruit_24bargraph(&i2c); I2C i2c(D7,D6); Adafruit_24bargraph ledbar_right=Adafruit_24bargraph(&i2c); DebounceIn upbutton(D9); DebounceIn downbutton(D8); DebounceIn leftbutton( ); DebounceIn rightbutton( ); //Scanner stuff DebounceIn scanbutton(D10); DigitalOut A_in(D0); DigitalOut B_in(D1); DigitalOut C_in(D2); DigitalOut D_in(D3); DigitalOut E_in(D4); DigitalOut F_in(D5); DigitalOut A_out(PTC7); DigitalOut B_out(PTC0); DigitalOut C_out(PTC3); AnalogOut dac(PTE30); AnalogIn adc(PTB0); //USBKeyboard keyboard; //LCD stuff TextLCD lcd(D13,D12,PTA17,PTA16,PTC17,PTC16,TextLCD::LCD20x4); // cc3000 KL25Z wifi connection // we need to define connection pins for: // - IRQ => (pin D3) // - Enable => (pin D5) // - SPI CS => (pin D10) // - SPI MOSI => (pin D11) // - SPI MISO => (pin D12) // - SPI CLK => (pin D13) // plus wifi network SSID, password, security level and smart-configuration flag. mbed_cc3000::cc3000 wifi(D3, D5, D10, SPI(D11, D12, D13), "SSID", "PASSWORD", WPA2, false); Websocket ws("ws://sockets.mbed.org/ws/toastboard/rw"); int main() { //Scan init float test_val = .001; float row_volt = 0; int con_mat[24][2] = {}; int a1,b1,c1,a2,b2,c2; float volt_mat[24][2] = {}; //dac = test_val; //LED init int redcount = 0, greencount = 0, rowselect = 0, rowselect_old = 0, moved = 1, colselect = 0; ledbar_left.begin(0x70); ledbar_left.clear(); ledbar_left.writeDisplay(); ledbar_right.begin(0x70); ledbar_right.clear(); ledbar_right.writeDisplay(); //LCD init lcd.cls(); string programname = "Dan's UI Test"; lcd.printf("%s",programname.c_str()); while(1) { //Display if (colselect == 0) { ledbar_left.clear(); ledbar_right.clear(); ledbar_left.setBar(rowselect,LED_GREEN); ledbar_left.writeDisplay(); ledbar_right.writeDisplay(); } else ledbar_left.clear(); ledbar_right.clear(); ledbar_right.setBar(rowselect,LED_GREEN); ledbar_right.writeDisplay(); ledbar_left.writeDisplay(); //Moving the selected row if (upbutton.read() == 0) { rowselect_old = rowselect; rowselect = rowselect-1; moved = 1; wait(0.75); } if (downbutton.read() == 0) { rowselect_old = rowselect; rowselect = rowselect+1; moved = 1; wait(0.75); } if (leftbutton.read() == 0) { colselect = 0; ledbar_right.clear(); moved =1; wait(0.75); } if (rightbutton.read() == 0) { colselect = 1; ledbar_left.clear(); moved =1; wait(0.75); } //Boundary checking if (rowselect > 23) { rowselect = 23; } if (rowselect < 0) { rowselect = 0; } //Implementing scanning if (scanbutton.read() == 0) { // Old mega-scan code. More refined version below /* for (int x = 0; x < 8; x++) { for (int y = 0; y < 8; y++) { // Stupid logic to convert count value to binary... A_in = x%2; a1 = x%2; B_in = (x/2)%2; b1 = (x/2)%2; C_in = (x/4)%2; c1 = (x/4)%2; A_out = y%2; int a2 = y%2; B_out = (y/2)%2; b2 = (y/2)%2; C_out = (y/4)%2; c2 = (y/4)%2; // Now we do the scan test, results are stored in con_mat //wait(0.01); dac = test_val; float in_val = adc.read(); if ((in_val > .0010) && (in_val < .0025)) con_mat[x][y] = 1; else con_mat[x][y] = 0; //keyboard.printf("%f %f \n",dac.read(),in_val); //keyboard.printf("%d %d %d\n",a2,b2,c2); } } for (int x=0;x<8;x++) { for (int y=0;y<8;y++) { keyboard.printf("%d ",con_mat[x][y]); }} */ //Displaying all connected rows as red light! ledbar.clear(); for (int i=0; i<8; i++) { if (con_mat[rowselect][i] == 1) { ledbar.setBar(i,LED_RED); } } ledbar.writeDisplay(); float vddmeasure = 3.14259; float vrowmeasure = 1.1234; lcd.cls(); lcd.locate(0,1); lcd.printf("Vdd: %1.1f V",vddmeasure); lcd.locate(0,0); lcd.printf("Row: %1.1f V",vrowmeasure); wait(2.5); ledbar.clear(); ledbar.writeDisplay(); lcd.cls(); string programname = "Dan's UI Test"; lcd.printf("%s",programname.c_str()); } } } /* ///// PUT ALL BELOW IN SCAN BUTTON IF //////// //Scans rows connected to vdd and ground. Vdd = 2 in con mat, Ground = 3. Rows connected to selected row = 1. //SET MULTIPLEXER TO READ VDD for (int i=0; i++; i<2) { for (int j=0; j++; i<24) { float test_val = adc.read(); if (test_val == 0.0) { // this node is ground... } else if ((test_val > vdd_samp-0.01) && (test_val < vdd_samp+0.01)) { // this node is VDD } else if ((test_val > select_val-0.01) && (test_val < select_val+0.01)) { // this node is connected to the selected node } else { // this node is floating? } } } A_in,B_in,C_in,D_in,E_in,F_in = 1; float vddval = adc.read(); //SET MULTIPLEXER TO READ SELECTED ROW // Sample the 'selected' node int sn = 0; int sn = (colselect + 1)*(rowselect + 1); A_in = (sn-1)&2; B_in = ((sn-1)/2)%2; C_in = ((sn-1)/4)%2; D_in = ((sn-1)/8)%2; E_in = ((sn-1)/16)%2; F_in = ((sn-1)/32)%2; float rowval = adc.read(); ledbar_left.clear(); ledbar_right.clear(); for (int x = 0; x < 2; x++) { for (int y = 0; y < 24; y++) { int sn = (colselect+1)*(rowselect+1); A_in = (sn-1)&2; B_in = ((sn-1)/2)%2; C_in = ((sn-1)/4)%2; D_in = ((sn-1)/8)%2; E_in = ((sn-1)/16)%2; F_in = ((sn-1)/32)%2; float in_val = adc.read(); volt_mat[x][y] = in_val; if (in_val == vddval){ con_mat[x][y] = 2; if (x == 0){ ledbar_left.setBar(y,LED_RED); } else { ledbar_right.setBar(y,LED_RED); } } if (in_val == 0){ con_mat[x][y] = 3; if (x == 0){ ledbar_left.setBar(y,LED_YELLOW); } else { ledbar_right.setBar(y,LED_YELLOW); } } if (in_val == rowval){ con_mat[x][y] = 1; if (x == 0){ ledbar_left.setBar(y,LED_GREEN); } else { ledbar_right.setBar(y,LED_GREEN); } } else { con_mat[x][y] = 0; } } moved = 0; //// PUT ALL ABOVE IN SCAN BUTTON IF ///// if (moved==0) { ledbar_left.writeDisplay(); ledbar_right.writeDisplay(); lcd.cls(); lcd.locate(0,1); lcd.printf("Vdd: %1.1f V",vddval); lcd.locate(0,0); lcd.printf("Row: %1.1f V",rowval); } else { lcd.cls(); string programname = "Dan's UI Test"; string instructions = "Select a row and scan it"; lcd.locate(0,0); lcd.printf("%s",programname.c_str()); lcd.locate(0,1); lcd.printf("%s",instructions.c_str()); } //Q: Do we need to do the same test for ground or can 0.00 be assumed? //Q: What is the most efficient way to compare all the "volt_mat" elements? //Q: Do we need to add a "confidence interval" around the rowval and vdd tests? */