Keg sharing system
Dependencies: 4DGL-uLCD-SE TextLCD mbed
main.cpp@3:861e3433e5e1, 2016-12-09 (annotated)
- Committer:
- taylornichols
- Date:
- Fri Dec 09 02:01:55 2016 +0000
- Revision:
- 3:861e3433e5e1
- Parent:
- 2:7d499335dda5
- Child:
- 4:bcb5be37a0e1
with LCD but doesn't do callback after validation;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
taylornichols | 0:dd375f44efef | 1 | #include "mbed.h" |
taylornichols | 1:f531f70a27c3 | 2 | #include "uLCD_4DGL.h" |
taylornichols | 1:f531f70a27c3 | 3 | #include "TextLCD.h" |
taylornichols | 0:dd375f44efef | 4 | #include <mpr121.h> |
taylornichols | 0:dd375f44efef | 5 | |
taylornichols | 0:dd375f44efef | 6 | // on-board LEDs |
taylornichols | 0:dd375f44efef | 7 | DigitalOut led1 ( LED1 ) ; |
taylornichols | 0:dd375f44efef | 8 | DigitalOut led2 ( LED2 ) ; |
taylornichols | 0:dd375f44efef | 9 | DigitalOut led3 ( LED3 ) ; |
taylornichols | 0:dd375f44efef | 10 | DigitalOut led4 ( LED4 ) ; |
taylornichols | 0:dd375f44efef | 11 | |
taylornichols | 3:861e3433e5e1 | 12 | // COM port |
taylornichols | 1:f531f70a27c3 | 13 | Serial com ( USBTX , USBRX , 9600 ); |
taylornichols | 0:dd375f44efef | 14 | |
taylornichols | 3:861e3433e5e1 | 15 | // keypad |
taylornichols | 0:dd375f44efef | 16 | InterruptIn interrupt ( p26 ) ; |
taylornichols | 0:dd375f44efef | 17 | I2C i2c ( p9 , p10 ) ; |
taylornichols | 0:dd375f44efef | 18 | Mpr121 keypad ( & i2c , Mpr121::ADD_VSS ) ; |
taylornichols | 0:dd375f44efef | 19 | |
taylornichols | 1:f531f70a27c3 | 20 | // LCD ( tx , rx , reset ) |
taylornichols | 3:861e3433e5e1 | 21 | uLCD_4DGL lcd ( p28 , p27 , p5 ) ; |
taylornichols | 1:f531f70a27c3 | 22 | |
taylornichols | 1:f531f70a27c3 | 23 | // flow meter |
taylornichols | 3:861e3433e5e1 | 24 | InterruptIn pulse_interrupt ( p11 ) ; |
taylornichols | 1:f531f70a27c3 | 25 | int unsigned pulse_count ( 0 ) ; |
taylornichols | 3:861e3433e5e1 | 26 | float pulse_milliLiters ( ) |
taylornichols | 3:861e3433e5e1 | 27 | { |
taylornichols | 3:861e3433e5e1 | 28 | return ( ( float ) pulse_count ) / 0.450f ; |
taylornichols | 3:861e3433e5e1 | 29 | } |
taylornichols | 1:f531f70a27c3 | 30 | void pulse ( ) |
taylornichols | 1:f531f70a27c3 | 31 | { |
taylornichols | 1:f531f70a27c3 | 32 | ++ pulse_count ; |
taylornichols | 3:861e3433e5e1 | 33 | lcd.locate ( 4 , 8 ) ; |
taylornichols | 3:861e3433e5e1 | 34 | lcd.printf ( "%f mL" , pulse_milliLiters ( ) ) ; |
taylornichols | 2:7d499335dda5 | 35 | } |
taylornichols | 2:7d499335dda5 | 36 | |
taylornichols | 3:861e3433e5e1 | 37 | void read_pin ( ) |
taylornichols | 3:861e3433e5e1 | 38 | { |
taylornichols | 3:861e3433e5e1 | 39 | lcd.filled_rectangle ( 0 , 0 , 128 , 128 , BLACK ) ; |
taylornichols | 3:861e3433e5e1 | 40 | lcd.locate ( 4 , 6 ) ; |
taylornichols | 3:861e3433e5e1 | 41 | lcd.printf ( "Enter PIN" ) ; |
taylornichols | 3:861e3433e5e1 | 42 | lcd.locate ( 4 , 7 ) ; |
taylornichols | 3:861e3433e5e1 | 43 | lcd.printf ( "on keypad" ) ; |
taylornichols | 3:861e3433e5e1 | 44 | } |
taylornichols | 3:861e3433e5e1 | 45 | |
taylornichols | 3:861e3433e5e1 | 46 | enum |
taylornichols | 3:861e3433e5e1 | 47 | { |
taylornichols | 3:861e3433e5e1 | 48 | pin_row = 8 , pin_col = 6 |
taylornichols | 3:861e3433e5e1 | 49 | } ; |
taylornichols | 1:f531f70a27c3 | 50 | |
taylornichols | 0:dd375f44efef | 51 | int unsigned pin_count ( 0 ) ; |
taylornichols | 0:dd375f44efef | 52 | int unsigned pin_value ( 0 ) ; |
taylornichols | 3:861e3433e5e1 | 53 | |
taylornichols | 0:dd375f44efef | 54 | void keypad_callback ( ) |
taylornichols | 0:dd375f44efef | 55 | { |
taylornichols | 0:dd375f44efef | 56 | led2 = ! led2 ; |
taylornichols | 1:f531f70a27c3 | 57 | |
taylornichols | 1:f531f70a27c3 | 58 | int value ( keypad.read(0x00) ) ; value += keypad.read(0x01) << 8 ; |
taylornichols | 1:f531f70a27c3 | 59 | |
taylornichols | 1:f531f70a27c3 | 60 | switch ( value ) // map keys to keypad values |
taylornichols | 0:dd375f44efef | 61 | { |
taylornichols | 1:f531f70a27c3 | 62 | case 0 : return ; // key release |
taylornichols | 3:861e3433e5e1 | 63 | |
taylornichols | 3:861e3433e5e1 | 64 | case 0x1 : |
taylornichols | 3:861e3433e5e1 | 65 | // DELETE |
taylornichols | 3:861e3433e5e1 | 66 | lcd.locate ( pin_col + pin_count , pin_row ) ; |
taylornichols | 3:861e3433e5e1 | 67 | lcd.printf ( " " ) ; |
taylornichols | 3:861e3433e5e1 | 68 | if ( pin_count != 0 ) |
taylornichols | 3:861e3433e5e1 | 69 | { |
taylornichols | 3:861e3433e5e1 | 70 | -- pin_count ; |
taylornichols | 3:861e3433e5e1 | 71 | } |
taylornichols | 3:861e3433e5e1 | 72 | pin_value /= 10 ; |
taylornichols | 3:861e3433e5e1 | 73 | return ; |
taylornichols | 3:861e3433e5e1 | 74 | |
taylornichols | 3:861e3433e5e1 | 75 | case 0x100 : |
taylornichols | 3:861e3433e5e1 | 76 | // DONE |
taylornichols | 3:861e3433e5e1 | 77 | com.printf ( "a%020f\n" , pulse_milliLiters ( ) ) ; |
taylornichols | 3:861e3433e5e1 | 78 | lcd.locate ( 0 , 10 ) ; |
taylornichols | 3:861e3433e5e1 | 79 | lcd.printf ( "Done pouring." ) ; |
taylornichols | 3:861e3433e5e1 | 80 | pulse_count = 0 ; |
taylornichols | 3:861e3433e5e1 | 81 | read_pin ( ) ; |
taylornichols | 3:861e3433e5e1 | 82 | return ; |
taylornichols | 3:861e3433e5e1 | 83 | |
taylornichols | 0:dd375f44efef | 84 | case 0x10 : pin_value = pin_value * 10 ; break ; // 0 |
taylornichols | 1:f531f70a27c3 | 85 | case 0x2 : pin_value = pin_value * 10 + 1 ; break ; // 1 |
taylornichols | 1:f531f70a27c3 | 86 | case 0x20 : pin_value = pin_value * 10 + 2 ; break ; // 2 |
taylornichols | 1:f531f70a27c3 | 87 | case 0x200 : pin_value = pin_value * 10 + 3 ; break ; // 3 |
taylornichols | 1:f531f70a27c3 | 88 | case 0x4 : pin_value = pin_value * 10 + 4 ; break ; // 4 |
taylornichols | 1:f531f70a27c3 | 89 | case 0x40 : pin_value = pin_value * 10 + 5 ; break ; // 5 |
taylornichols | 1:f531f70a27c3 | 90 | case 0x400 : pin_value = pin_value * 10 + 6 ; break ; // 6 |
taylornichols | 1:f531f70a27c3 | 91 | case 0x8 : pin_value = pin_value * 10 + 7 ; break ; // 7 |
taylornichols | 1:f531f70a27c3 | 92 | case 0x80 : pin_value = pin_value * 10 + 8 ; break ; // 8 |
taylornichols | 1:f531f70a27c3 | 93 | case 0x800 : pin_value = pin_value * 10 + 9 ; break ; // 9 |
taylornichols | 0:dd375f44efef | 94 | } |
taylornichols | 3:861e3433e5e1 | 95 | |
taylornichols | 3:861e3433e5e1 | 96 | lcd.locate ( pin_col + pin_count , pin_row ) ; |
taylornichols | 3:861e3433e5e1 | 97 | lcd.printf ( "*" ) ; |
taylornichols | 3:861e3433e5e1 | 98 | |
taylornichols | 1:f531f70a27c3 | 99 | if ( pin_count == 3 ) |
taylornichols | 0:dd375f44efef | 100 | { |
taylornichols | 1:f531f70a27c3 | 101 | com.printf ( "p%04d\n\r" , pin_value ) ; // transmit pin |
taylornichols | 3:861e3433e5e1 | 102 | |
taylornichols | 3:861e3433e5e1 | 103 | pin_value = pin_count = 0 ; // reset pin |
taylornichols | 3:861e3433e5e1 | 104 | |
taylornichols | 1:f531f70a27c3 | 105 | char readbuffer [ 2 ] ; |
taylornichols | 3:861e3433e5e1 | 106 | com.gets ( readbuffer , 2 ) ; // receive verification |
taylornichols | 3:861e3433e5e1 | 107 | |
taylornichols | 3:861e3433e5e1 | 108 | lcd.locate ( 4 , 6 ) ; |
taylornichols | 1:f531f70a27c3 | 109 | |
taylornichols | 1:f531f70a27c3 | 110 | switch ( readbuffer [ 0 ] ) // parse verification |
taylornichols | 1:f531f70a27c3 | 111 | { |
taylornichols | 1:f531f70a27c3 | 112 | case '0' : // INVALID |
taylornichols | 3:861e3433e5e1 | 113 | lcd.filled_rectangle ( 0 , 0 , 128 , 128 , RED ) ; |
taylornichols | 3:861e3433e5e1 | 114 | lcd.locate ( 4 , 5 ) ; |
taylornichols | 3:861e3433e5e1 | 115 | lcd.printf ( "INVALID PIN" ) ; |
taylornichols | 1:f531f70a27c3 | 116 | led3 = ! led3 ; |
taylornichols | 3:861e3433e5e1 | 117 | wait_ms ( 1024 ) ; |
taylornichols | 3:861e3433e5e1 | 118 | read_pin ( ) ; |
taylornichols | 1:f531f70a27c3 | 119 | break ; |
taylornichols | 1:f531f70a27c3 | 120 | |
taylornichols | 1:f531f70a27c3 | 121 | case '1' : // VALID |
taylornichols | 3:861e3433e5e1 | 122 | lcd.filled_rectangle ( 0 , 0 , 128 , 128 , GREEN ) ; |
taylornichols | 3:861e3433e5e1 | 123 | lcd.printf ( "Pour beer" ) ; |
taylornichols | 3:861e3433e5e1 | 124 | lcd.locate ( 4 , 8 ) ; |
taylornichols | 1:f531f70a27c3 | 125 | led4 = ! led4 ; |
taylornichols | 3:861e3433e5e1 | 126 | char buffer [ 6 ] ; |
taylornichols | 1:f531f70a27c3 | 127 | com.gets ( buffer , sizeof ( buffer ) ) ; |
taylornichols | 3:861e3433e5e1 | 128 | lcd.locate ( 4 , 10 ) ; |
taylornichols | 3:861e3433e5e1 | 129 | lcd.printf ( "Current owed: $%s" , buffer ) ; |
taylornichols | 1:f531f70a27c3 | 130 | break ; |
taylornichols | 1:f531f70a27c3 | 131 | |
taylornichols | 1:f531f70a27c3 | 132 | default: // ERROR |
taylornichols | 3:861e3433e5e1 | 133 | lcd.filled_rectangle ( 0 , 0 , 128 , 128 , YELLOW ) ; |
taylornichols | 3:861e3433e5e1 | 134 | lcd.printf ( "TRANSMISSION ERROR" ) ; |
taylornichols | 1:f531f70a27c3 | 135 | led2 = ! led2 ; |
taylornichols | 3:861e3433e5e1 | 136 | exit ( 1 ) ; |
taylornichols | 1:f531f70a27c3 | 137 | break ; |
taylornichols | 1:f531f70a27c3 | 138 | } |
taylornichols | 1:f531f70a27c3 | 139 | return ; |
taylornichols | 0:dd375f44efef | 140 | } |
taylornichols | 0:dd375f44efef | 141 | ++ pin_count ; |
taylornichols | 0:dd375f44efef | 142 | } |
taylornichols | 0:dd375f44efef | 143 | |
taylornichols | 0:dd375f44efef | 144 | int main ( ) |
taylornichols | 0:dd375f44efef | 145 | { |
taylornichols | 2:7d499335dda5 | 146 | pulse_interrupt.rise ( & pulse ) ; |
taylornichols | 0:dd375f44efef | 147 | interrupt.fall ( & keypad_callback ) ; |
taylornichols | 0:dd375f44efef | 148 | interrupt.mode ( PullUp ) ; |
taylornichols | 3:861e3433e5e1 | 149 | |
taylornichols | 3:861e3433e5e1 | 150 | read_pin ( ) ; |
taylornichols | 0:dd375f44efef | 151 | |
taylornichols | 0:dd375f44efef | 152 | while(1) |
taylornichols | 0:dd375f44efef | 153 | { |
taylornichols | 0:dd375f44efef | 154 | led1 = 1; |
taylornichols | 0:dd375f44efef | 155 | wait(0.2); |
taylornichols | 0:dd375f44efef | 156 | led1 = 0; |
taylornichols | 0:dd375f44efef | 157 | wait(0.2); |
taylornichols | 0:dd375f44efef | 158 | } |
taylornichols | 0:dd375f44efef | 159 | } |