アナログポート から スイッチを3つ認識するライブラリです。 6つのアナログポートを同時に認識して、18個のSWまで認識できます。

Dependents:   kitchenTimer LPC1114FN28_kitchenTimer_Clock

Revision:
0:ba027616fdf1
Child:
1:ebaa87e67cef
diff -r 000000000000 -r ba027616fdf1 SwAnalog.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SwAnalog.h	Sun Feb 12 00:50:23 2012 +0000
@@ -0,0 +1,310 @@
+/* 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