アナログポート から スイッチを3つ認識するライブラリです。 6つのアナログポートを同時に認識して、18個のSWまで認識できます。
Dependents: kitchenTimer LPC1114FN28_kitchenTimer_Clock
SwAnalog.h
- Committer:
- suupen
- Date:
- 2012-02-12
- Revision:
- 0:ba027616fdf1
- Child:
- 1:ebaa87e67cef
File content as of revision 0:ba027616fdf1:
/* SwAnalog Library * Copyright (c) 2012 suupen * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ /***********************************************************************/ /* */ /* SwAnalog.h */ /* */ /* */ /* 2012/02/12 : V1.0 */ /***********************************************************************/ #ifndef _SWANALOG_H #define _SWANALOG_H #include "mbed.h" /** SWANALOG control class, based on a "mbed function" * * Example: * @code * //******************************************************************** * // SwAnalogInput Library example program * // mbed no analog port de 3hon no sw wo ninsiki suru. * // 6hon no analog port (p15 - p20) de 6 * 3 = 18 ko no sw ninsiki ga dekiru. * // * // <schematic> * // -.- mbed VOUT(+3.3[V]) * // | |--------------------> mbed p20(ADinput) * // | --------- --------- --------- | --------- * // .---| Rsw2 |---.---| Rsw1 |---.---| Rsw0 |---.---| Rout |----| * // | --------- | --------- | --------- | --------- | * // | ---- | ----- | ----- | | * // |-----o o------.-----o o------.-----o o------| ----- * // SW2 SW1 SW0 mbed GND(0[V]) * // * // Rsw2 : 8.2[kohm], Rsw1 = 3.9[kohm], Rsw0 = 2.0[kohm], Rout = 1.0[kohm] (R no seido ha +-1[%]) * // * // <program no naiyo> * // mbed LED1 : sw0 no level de tento sw Off = led Off, sw On = led On * // mbed LED2 : sw1 no level de tento sw Off = led Off, sw On = led On * // mbed LED3 : sw2 no level de tento sw Off = led Off, sw On = led On * // mbed LED4 : sw0,sw1,sw2 no Off kara On henka de led tento jotai wo hanten. * // * // * // <rireki> * // 2012/02/12 : syohan * // ********************************************************************* * * #include "mbed.h" * #include "SwAnalog.h" * * DigitalOut led1(LED1); * DigitalOut led2(LED2); * DigitalOut led3(LED3); * DigitalOut led4(LED4); * * SwAnalog sw(p20); // p20(adinput) :sw0,sw1,sw2 * * int main() { * while(1) { * // sw level and edge data refresh * sw.refreshEdgeData(); * * // tact action (sw0 level = on : led1 = on) * led1 = sw.checkLevel(0); * * // tact action (sw1 level = off : led2 = on) * led2 = sw.checkLevel(1); * * // tact action (sw2 level = off : led3 = on) * led3 = sw.checkLevel(2); * * // toggle action (sw0 to sw3 level Off to On : led4 invert ) * if((sw.checkEdgeOn(0) == 1) // sw0 * || (sw.checkEdgeOn(1) == 1) // sw1 * || (sw.checkEdgeOn(2) == 1) // sw2 * ){ * led4 = !led4; * } * } * } * @endcode */ class SwAnalog { public: /** Create a sw analog input object connected to the specified analog Input pin * * @param PinName adinput0 : analog input pin(pin15 to pin20) : sw0 kara sw2 no ninsiki * @param PinName adinput1 : analog input pin(pin15 to pin20) : sw3 kara sw5 no ninsiki * @param PinName adinput2 : analog input pin(pin15 to pin20) : sw6 kara sw8 no ninsiki * @param PinName adinput3 : analog input pin(pin15 to pin20) : sw9 kara sw11 no ninsiki * @param PinName adinput4 : analog input pin(pin15 to pin20) : sw12 kara sw14 no ninsiki * @param PinName adinput5 : analog input pin(pin15 to pin20) : sw15 kara sw17 no ninsiki * * Recognition of the SW period is 10ms */ SwAnalog(PinName adinput0 = NC, PinName adinput1 = NC, PinName adinput2 = NC, PinName adinput3 = NC, PinName adinput4 = NC, PinName adinput5 = NC ); /** refresh edge data * * @param none * @param return none * * main de edge data wo tukau maeni jiko suru */ void refreshEdgeData(void); /** Check Off to On edge * * @param uint8_t swNo : 0:sw0, 1:sw1, ... ,17:sw17 * @param return uint8_t On edge check 0: edge Nasi 1: edge Ari * */ uint8_t checkEdgeOn(uint8_t swNo); /** Check On to Off edge * * @param uint8_t swNo : 0:sw0, 1:sw1, ... ,17:sw17 * @param return uint8_t Off edge check 0 : Nasi 1 : Ari * */ uint8_t checkEdgeOff(uint8_t swNo); /** Check sw Level * * @param uint8_t swNo : 0:sw0, 1:sw1, ... ,17:sw17 * @param return uint8_t sw level check 0 : Off 1 : On * */ uint8_t checkLevel(uint8_t swNo); /** SW Number call name * * @param adinput0 : Z_sw1 to Z_sw3 * @param adinput1 : Z_sw4 to Z_sw6 * @param .... * @param adinput5 : Z_sw16 tp Z_sw18 */ enum{ Z_sw0, // adinput1 no sw Z_sw1, Z_sw2, Z_sw3, // adinput2 no sw Z_sw4, Z_sw5, Z_sw6, // adinput3 no sw Z_sw7, Z_sw8, Z_sw9, // adinput4 no sw Z_sw10, Z_sw11, Z_sw12, // adinput5 no sw Z_sw13, Z_sw14, Z_sw15, // adinput6 no sw Z_sw16, Z_sw17 }; //protected: private: AnalogIn _adinput0; AnalogIn _adinput1; AnalogIn _adinput2; AnalogIn _adinput3; AnalogIn _adinput4; AnalogIn _adinput5; Ticker swCheckTimer; void input(void); #define Z_matchcycle (10000) // 10000[us](10[ms]) to 100000[us](100[ms]) 1[us]/count uint8_t D_swPinSuu; // touroku sareta Sw Pin Suu 1 to Z_swPinSuuMax #define Z_swPinSuuMax (6) // SW warituke pin suu max #define Z_swInNoMax (3) // 1pin atari no sw setuzoku suu (1pin ni 3ko no sw setuzoku) uint8_t B_kariLevel[Z_swPinSuuMax * Z_swInNoMax]; // kakutei mae no ninsiki Level 0bit:saisin(t) 1bit:t-1, ... ,7bit:t-7 0:Off 1:On // match number define //#define Z_itchiPattern (0x03) // 2kai itch #define Z_itchiPattern (0x07) // 3kai itchi //#define Z_itchiPattern (0x0f) // 4kai itchi //#define Z_itchiPattern (0x1f) // 5kai itchi //#define Z_itchiPattern (0x3f) // 6kai itchi //#define Z_itchiPattern (0x7f) // 7kai itchi //#define Z_itchiPattern (0xff) // 8kai itchi // sw level data uint8_t D_nowLevel[Z_swPinSuuMax * Z_swInNoMax]; // saisin no kakutei Level 0:Off 1:On uint8_t D_oldLevel[Z_swPinSuuMax * Z_swInNoMax]; // zenkai no kakutei Level 0:Off 1:On #define Z_levelOff (0) #define Z_levelOn (1) // sw edge data // swDigital.c naibu hensu uint8_t B_edgeOn[Z_swPinSuuMax * Z_swInNoMax]; // off kara on no ninsiki(on edge) 0:Nasi 1:Ari uint8_t B_edgeOff[Z_swPinSuuMax * Z_swInNoMax]; // on kara off no ninsiki(off edge) 0:Nasi 1:Ari // user use hensu uint8_t D_edgeOn[Z_swPinSuuMax * Z_swInNoMax]; // off kara on no ninsiki(on edge) 0:Nasi 1:Ari uint8_t D_edgeOff[Z_swPinSuuMax * Z_swInNoMax]; // on kara off no ninsiki(off edge) 0:Nasi 1:Ari #define Z_edgeNasi (0) #define Z_edgeAri (1) //------------------ // Resistor network //------------------ // -.- mbed VOUT(+3.3[V]) // | |--------------------> mbed p15 - p20(analog port) // | --------- --------- --------- | --------- // .---| Rsw2 |---.---| Rsw1 |---.---| Rsw0 |---.---| Rout |----| // | --------- | --------- | --------- | --------- | // | ---- | ----- | ----- | | // |-----o o------.-----o o------.-----o o------| ----- // SW2 SW1 SW0 mbed GND(0[V]) // // | | // |<----------------------- Rall --------------------------------->| // | | | // ----> Z_R0 to Z_R7 #define Z_Rsw2 (8200.0F) // SW2 no R (1/1 [ohm]/count) #define Z_Rsw1 (3900.0F) // SW1 no R (1/1 [ohm]/count) #define Z_Rsw0 (2000.0F) // adinput1 no R (1/1 [ohm]/count) #define Z_Rout (1000.0F) // Vout no R (1/1 [ohm]/count) //Z_Rsw2,Z_Rsw1,Z_Rsw0,Z_Rout niwa +-1[%]no seido no teiko wo tukau koto #define Z_gosaMax (1.020F) // Z_Rout(max) / Z_Rx(min) = (Z_Rout * 1.01) / (Z_Rx * 0.99) = (Z_Rout / Z_Rx) * 1.020 #define Z_gosaMin (0.990F) // Z_Rout(min) / Z_Rx(max) = (Z_Rout * 0.99) / (Z_Rx * 1.01) = (Z_Rout / Z_Rx) * 0.980 // Rall keisanchi // SW2 SW1 SW0 #define Z_R0 ((Z_Rsw2 + Z_Rsw1 + Z_Rsw0 + Z_Rout)) // OFF OFF OFF #define Z_R1 ((Z_Rsw2 + Z_Rsw1 + 0 + Z_Rout)) // OFF OFF ON #define Z_R2 ((Z_Rsw2 + 0 + Z_Rsw0 + Z_Rout)) // OFF ON OFF #define Z_R3 ((Z_Rsw2 + 0 + 0 + Z_Rout)) // OFF ON ON #define Z_R4 ((0 + Z_Rsw1 + Z_Rsw0 + Z_Rout)) // ON OFF OFF #define Z_R5 ((0 + Z_Rsw1 + 0 + Z_Rout)) // ON OFF ON #define Z_R6 ((0 + 0 + Z_Rsw0 + Z_Rout)) // ON ON OFF #define Z_R7 ((0 + 0 + 0 + Z_Rout)) // ON ON ON // Rout : Rall (max , min) #define Z_R0max (((Z_Rout * Z_gosaMax) / Z_R0)) #define Z_R0min (((Z_Rout * Z_gosaMin) / Z_R0)) #define Z_R1max (((Z_Rout * Z_gosaMax) / Z_R1)) #define Z_R1min (((Z_Rout * Z_gosaMin) / Z_R1)) #define Z_R2max (((Z_Rout * Z_gosaMax) / Z_R2)) #define Z_R2min (((Z_Rout * Z_gosaMin) / Z_R2)) #define Z_R3max (((Z_Rout * Z_gosaMax) / Z_R3)) #define Z_R3min (((Z_Rout * Z_gosaMin) / Z_R3)) #define Z_R4max (((Z_Rout * Z_gosaMax) / Z_R4)) #define Z_R4min (((Z_Rout * Z_gosaMin) / Z_R4)) #define Z_R5max (((Z_Rout * Z_gosaMax) / Z_R5)) #define Z_R5min (((Z_Rout * Z_gosaMin) / Z_R5)) #define Z_R6max (((Z_Rout * Z_gosaMax) / Z_R6)) #define Z_R6min (((Z_Rout * Z_gosaMin) / Z_R6)) #define Z_R7max (((Z_Rout * Z_gosaMax) / Z_R7)) #define Z_R7min (((Z_Rout * Z_gosaMin) / Z_R7)) // threshold lvevel // GND(0[V]) -> 0_1 -> 1_2 -> 2_3 -> 3_4 -> 4_5 -> 5_6 -> 6_7 -> Vcc(3.3[V]) // --------------+------+------+------+------+------+------+--------------- // SW0 | OFF ON OFF ON OFF ON OFF ON // SW1 | OFF OFF ON ON OFF OFF ON ON // SW2 | OFF OFF OFF OFF ON ON ON ON #define Z_threshold0_1 (((Z_R0max + Z_R1min) / 2)) #define Z_threshold1_2 (((Z_R1max + Z_R2min) / 2)) #define Z_threshold2_3 (((Z_R2max + Z_R3min) / 2)) #define Z_threshold3_4 (((Z_R3max + Z_R4min) / 2)) #define Z_threshold4_5 (((Z_R4max + Z_R5min) / 2)) #define Z_threshold5_6 (((Z_R5max + Z_R6min) / 2)) #define Z_threshold6_7 (((Z_R6max + Z_R7min) / 2)) void adInput(float ad, uint8_t swInNo); }; #endif // _SWANALOG_H