2017-06-23 03:54:44 +02:00
const initRegisterArray : number [ ] = [
0xEF , 0x00 , 0x32 , 0x29 , 0x33 , 0x01 , 0x34 , 0x00 , 0x35 , 0x01 , 0x36 , 0x00 , 0x37 , 0x07 , 0x38 , 0x17 ,
0x39 , 0x06 , 0x3A , 0x12 , 0x3F , 0x00 , 0x40 , 0x02 , 0x41 , 0xFF , 0x42 , 0x01 , 0x46 , 0x2D , 0x47 , 0x0F ,
0x48 , 0x3C , 0x49 , 0x00 , 0x4A , 0x1E , 0x4B , 0x00 , 0x4C , 0x20 , 0x4D , 0x00 , 0x4E , 0x1A , 0x4F , 0x14 ,
0x50 , 0x00 , 0x51 , 0x10 , 0x52 , 0x00 , 0x5C , 0x02 , 0x5D , 0x00 , 0x5E , 0x10 , 0x5F , 0x3F , 0x60 , 0x27 ,
0x61 , 0x28 , 0x62 , 0x00 , 0x63 , 0x03 , 0x64 , 0xF7 , 0x65 , 0x03 , 0x66 , 0xD9 , 0x67 , 0x03 , 0x68 , 0x01 ,
0x69 , 0xC8 , 0x6A , 0x40 , 0x6D , 0x04 , 0x6E , 0x00 , 0x6F , 0x00 , 0x70 , 0x80 , 0x71 , 0x00 , 0x72 , 0x00 ,
0x73 , 0x00 , 0x74 , 0xF0 , 0x75 , 0x00 , 0x80 , 0x42 , 0x81 , 0x44 , 0x82 , 0x04 , 0x83 , 0x20 , 0x84 , 0x20 ,
0x85 , 0x00 , 0x86 , 0x10 , 0x87 , 0x00 , 0x88 , 0x05 , 0x89 , 0x18 , 0x8A , 0x10 , 0x8B , 0x01 , 0x8C , 0x37 ,
0x8D , 0x00 , 0x8E , 0xF0 , 0x8F , 0x81 , 0x90 , 0x06 , 0x91 , 0x06 , 0x92 , 0x1E , 0x93 , 0x0D , 0x94 , 0x0A ,
0x95 , 0x0A , 0x96 , 0x0C , 0x97 , 0x05 , 0x98 , 0x0A , 0x99 , 0x41 , 0x9A , 0x14 , 0x9B , 0x0A , 0x9C , 0x3F ,
0x9D , 0x33 , 0x9E , 0xAE , 0x9F , 0xF9 , 0xA0 , 0x48 , 0xA1 , 0x13 , 0xA2 , 0x10 , 0xA3 , 0x08 , 0xA4 , 0x30 ,
0xA5 , 0x19 , 0xA6 , 0x10 , 0xA7 , 0x08 , 0xA8 , 0x24 , 0xA9 , 0x04 , 0xAA , 0x1E , 0xAB , 0x1E , 0xCC , 0x19 ,
0xCD , 0x0B , 0xCE , 0x13 , 0xCF , 0x64 , 0xD0 , 0x21 , 0xD1 , 0x0F , 0xD2 , 0x88 , 0xE0 , 0x01 , 0xE1 , 0x04 ,
0xE2 , 0x41 , 0xE3 , 0xD6 , 0xE4 , 0x00 , 0xE5 , 0x0C , 0xE6 , 0x0A , 0xE7 , 0x00 , 0xE8 , 0x00 , 0xE9 , 0x00 ,
0xEE , 0x07 , 0xEF , 0x01 , 0x00 , 0x1E , 0x01 , 0x1E , 0x02 , 0x0F , 0x03 , 0x10 , 0x04 , 0x02 , 0x05 , 0x00 ,
0x06 , 0xB0 , 0x07 , 0x04 , 0x08 , 0x0D , 0x09 , 0x0E , 0x0A , 0x9C , 0x0B , 0x04 , 0x0C , 0x05 , 0x0D , 0x0F ,
0x0E , 0x02 , 0x0F , 0x12 , 0x10 , 0x02 , 0x11 , 0x02 , 0x12 , 0x00 , 0x13 , 0x01 , 0x14 , 0x05 , 0x15 , 0x07 ,
0x16 , 0x05 , 0x17 , 0x07 , 0x18 , 0x01 , 0x19 , 0x04 , 0x1A , 0x05 , 0x1B , 0x0C , 0x1C , 0x2A , 0x1D , 0x01 ,
0x1E , 0x00 , 0x21 , 0x00 , 0x22 , 0x00 , 0x23 , 0x00 , 0x25 , 0x01 , 0x26 , 0x00 , 0x27 , 0x39 , 0x28 , 0x7F ,
0x29 , 0x08 , 0x30 , 0x03 , 0x31 , 0x00 , 0x32 , 0x1A , 0x33 , 0x1A , 0x34 , 0x07 , 0x35 , 0x07 , 0x36 , 0x01 ,
0x37 , 0xFF , 0x38 , 0x36 , 0x39 , 0x07 , 0x3A , 0x00 , 0x3E , 0xFF , 0x3F , 0x00 , 0x40 , 0x77 , 0x41 , 0x40 ,
0x42 , 0x00 , 0x43 , 0x30 , 0x44 , 0xA0 , 0x45 , 0x5C , 0x46 , 0x00 , 0x47 , 0x00 , 0x48 , 0x58 , 0x4A , 0x1E ,
0x4B , 0x1E , 0x4C , 0x00 , 0x4D , 0x00 , 0x4E , 0xA0 , 0x4F , 0x80 , 0x50 , 0x00 , 0x51 , 0x00 , 0x52 , 0x00 ,
0x53 , 0x00 , 0x54 , 0x00 , 0x57 , 0x80 , 0x59 , 0x10 , 0x5A , 0x08 , 0x5B , 0x94 , 0x5C , 0xE8 , 0x5D , 0x08 ,
0x5E , 0x3D , 0x5F , 0x99 , 0x60 , 0x45 , 0x61 , 0x40 , 0x63 , 0x2D , 0x64 , 0x02 , 0x65 , 0x96 , 0x66 , 0x00 ,
0x67 , 0x97 , 0x68 , 0x01 , 0x69 , 0xCD , 0x6A , 0x01 , 0x6B , 0xB0 , 0x6C , 0x04 , 0x6D , 0x2C , 0x6E , 0x01 ,
0x6F , 0x32 , 0x71 , 0x00 , 0x72 , 0x01 , 0x73 , 0x35 , 0x74 , 0x00 , 0x75 , 0x33 , 0x76 , 0x31 , 0x77 , 0x01 ,
0x7C , 0x84 , 0x7D , 0x03 , 0x7E , 0x01
] ;
2020-09-17 17:37:28 +02:00
let TubeTab : number [ ] = [
2017-06-23 03:54:44 +02:00
0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 ,
0x7f , 0x6f , 0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71
] ;
/ * *
* Grove Gestures
* /
enum GroveGesture {
//% block=None
None = 0 ,
//% block=Right
Right = 1 ,
//% block=Left
Left = 2 ,
//% block=Up
Up = 3 ,
//% block=Down
Down = 4 ,
//% block=Forward
Forward = 5 ,
//% block=Backward
Backward = 6 ,
//% block=Clockwise
Clockwise = 7 ,
//% block=Anticlockwise
Anticlockwise = 8 ,
//% block=Wave
Wave = 9
}
2018-09-14 08:11:57 +02:00
enum GroveJoystickKey {
2020-09-17 21:11:26 +02:00
//% block="None"
2018-09-14 08:11:57 +02:00
None = 0 ,
2020-09-17 21:11:26 +02:00
//% block="Right"
2018-09-14 08:11:57 +02:00
Right = 1 ,
2020-09-17 21:11:26 +02:00
//% block="Left"
2018-09-14 08:11:57 +02:00
Left = 2 ,
2020-09-17 21:11:26 +02:00
//% block="Up"
2018-09-14 08:11:57 +02:00
Up = 3 ,
2020-09-17 21:11:26 +02:00
//% block="Down"
2018-09-14 08:11:57 +02:00
Down = 4 ,
2020-09-17 21:11:26 +02:00
//% block="Upper left"
2018-09-14 08:11:57 +02:00
UL = 5 ,
2020-09-17 21:11:26 +02:00
//% block="Upper right"
2018-09-14 08:11:57 +02:00
UR = 6 ,
2020-09-17 21:11:26 +02:00
//% block="Lower left"
2018-09-14 08:11:57 +02:00
LL = 7 ,
2020-09-17 21:11:26 +02:00
//% block="Lower right"
2018-09-14 08:11:57 +02:00
LR = 8 ,
2020-09-17 21:11:26 +02:00
//% block="press"
2018-09-14 08:11:57 +02:00
Press = 9
}
2017-06-23 03:54:44 +02:00
/ * *
* Functions to operate Grove module .
* /
2020-09-17 18:50:27 +02:00
//% weight=10 color=#9F79EE icon="\uf1b3" block="Grove"
2020-10-12 14:55:42 +02:00
//% groups='["4-Digit","Ultrasonic","Gesture","Thumbjoystick","UartWiFi"]'
2017-06-23 03:54:44 +02:00
namespace grove {
/ * *
*
* /
export class PAJ7620 {
private paj7620WriteReg ( addr : number , cmd : number ) {
let buf : Buffer = pins . createBuffer ( 2 ) ;
buf [ 0 ] = addr ;
buf [ 1 ] = cmd ;
pins . i2cWriteBuffer ( 0x73 , buf , false ) ;
}
private paj7620ReadReg ( addr : number ) : number {
let buf : Buffer = pins . createBuffer ( 1 ) ;
buf [ 0 ] = addr ;
pins . i2cWriteBuffer ( 0x73 , buf , false ) ;
buf = pins . i2cReadBuffer ( 0x73 , 1 , false ) ;
return buf [ 0 ] ;
}
private paj7620SelectBank ( bank : number ) {
if ( bank == 0 ) this . paj7620WriteReg ( 0xEF , 0 ) ;
else if ( bank == 1 ) this . paj7620WriteReg ( 0xEF , 1 ) ;
}
private paj7620Init() {
let temp = 0 ;
this . paj7620SelectBank ( 0 ) ;
temp = this . paj7620ReadReg ( 0 ) ;
if ( temp == 0x20 ) {
for ( let i = 0 ; i < 438 ; i += 2 ) {
this . paj7620WriteReg ( initRegisterArray [ i ] , initRegisterArray [ i + 1 ] ) ;
}
}
this . paj7620SelectBank ( 0 ) ;
}
/ * *
* Create a new driver of Grove - Gesture
* /
2020-09-22 21:36:20 +02:00
init() {
2017-06-23 03:54:44 +02:00
this . paj7620Init ( ) ;
basic . pause ( 200 ) ;
}
/ * *
* Detect and recognize the gestures from Grove - Gesture
* /
2020-09-22 21:36:20 +02:00
2017-06-23 03:54:44 +02:00
read ( ) : number {
let data = 0 , result = 0 ;
data = this . paj7620ReadReg ( 0x43 ) ;
switch ( data ) {
case 0x01 :
result = GroveGesture . Right ;
2020-09-17 17:37:28 +02:00
break ;
2017-06-23 03:54:44 +02:00
case 0x02 :
result = GroveGesture . Left ;
2020-09-17 17:37:28 +02:00
break ;
2017-06-23 03:54:44 +02:00
case 0x04 :
result = GroveGesture . Up ;
2020-09-17 17:37:28 +02:00
break ;
2017-06-23 03:54:44 +02:00
case 0x08 :
result = GroveGesture . Down ;
2020-09-17 17:37:28 +02:00
break ;
2017-06-23 03:54:44 +02:00
case 0x10 :
result = GroveGesture . Forward ;
2020-09-17 17:37:28 +02:00
break ;
2017-06-23 03:54:44 +02:00
case 0x20 :
result = GroveGesture . Backward ;
2020-09-17 17:37:28 +02:00
break ;
2017-06-23 03:54:44 +02:00
case 0x40 :
result = GroveGesture . Clockwise ;
2020-09-17 17:37:28 +02:00
break ;
2017-06-23 03:54:44 +02:00
case 0x80 :
result = GroveGesture . Anticlockwise ;
2020-09-17 17:37:28 +02:00
break ;
2017-06-23 03:54:44 +02:00
default :
data = this . paj7620ReadReg ( 0x44 ) ;
if ( data == 0x01 )
result = GroveGesture . Wave ;
2020-09-17 17:37:28 +02:00
break ;
2017-06-23 03:54:44 +02:00
}
return result ;
}
}
2020-09-17 17:37:28 +02:00
2017-06-23 03:54:44 +02:00
/ * *
*
* /
2020-09-17 17:37:28 +02:00
export class TM1637
{
2017-06-23 03:54:44 +02:00
clkPin : DigitalPin ;
dataPin : DigitalPin ;
2020-09-17 17:37:28 +02:00
brightnessLevel : number ;
2017-06-23 03:54:44 +02:00
pointFlag : boolean ;
2017-10-23 04:23:08 +02:00
buf : Buffer ;
2017-06-23 03:54:44 +02:00
2020-09-17 17:37:28 +02:00
private writeByte ( wrData : number )
{
for ( let i = 0 ; i < 8 ; i ++ )
{
2017-06-23 03:54:44 +02:00
pins . digitalWritePin ( this . clkPin , 0 ) ;
2020-09-17 17:37:28 +02:00
if ( wrData & 0x01 ) pins . digitalWritePin ( this . dataPin , 1 ) ;
2017-06-23 03:54:44 +02:00
else pins . digitalWritePin ( this . dataPin , 0 ) ;
wrData >>= 1 ;
pins . digitalWritePin ( this . clkPin , 1 ) ;
}
2020-09-17 17:37:28 +02:00
2017-06-23 03:54:44 +02:00
pins . digitalWritePin ( this . clkPin , 0 ) ; // Wait for ACK
pins . digitalWritePin ( this . dataPin , 1 ) ;
pins . digitalWritePin ( this . clkPin , 1 ) ;
}
2020-09-17 17:37:28 +02:00
private start ( )
{
2017-06-23 03:54:44 +02:00
pins . digitalWritePin ( this . clkPin , 1 ) ;
pins . digitalWritePin ( this . dataPin , 1 ) ;
pins . digitalWritePin ( this . dataPin , 0 ) ;
pins . digitalWritePin ( this . clkPin , 0 ) ;
}
2020-09-17 17:37:28 +02:00
private stop ( )
{
2017-06-23 03:54:44 +02:00
pins . digitalWritePin ( this . clkPin , 0 ) ;
pins . digitalWritePin ( this . dataPin , 0 ) ;
pins . digitalWritePin ( this . clkPin , 1 ) ;
pins . digitalWritePin ( this . dataPin , 1 ) ;
}
2020-09-17 17:37:28 +02:00
private coding ( dispData : number ) : number
{
2017-06-23 03:54:44 +02:00
let pointData = 0 ;
2020-09-17 17:37:28 +02:00
if ( this . pointFlag == true ) pointData = 0x80 ;
else if ( this . pointFlag == false ) pointData = 0 ;
if ( dispData == 0x7f ) dispData = 0x00 + pointData ;
2017-06-23 03:54:44 +02:00
else dispData = TubeTab [ dispData ] + pointData ;
2020-09-17 17:37:28 +02:00
2017-06-23 03:54:44 +02:00
return dispData ;
2020-09-17 17:37:28 +02:00
}
2017-06-23 03:54:44 +02:00
/ * *
* Show a 4 digits number on display
* @param dispData value of number
* /
2020-09-17 18:22:51 +02:00
2020-09-17 17:46:57 +02:00
//% blockId=grove_tm1637_display_number block="%4Digit|show number|%dispData"
2020-09-17 18:22:51 +02:00
//% group="4-Digit"
2020-09-17 17:37:28 +02:00
show ( dispData : number )
{
let compare_01 :number = dispData % 100 ;
let compare_001 :number = dispData % 1000 ;
if ( dispData < 10 )
{
2017-06-28 06:13:59 +02:00
this . bit ( dispData , 3 ) ;
this . bit ( 0x7f , 2 ) ;
this . bit ( 0x7f , 1 ) ;
2020-09-17 17:37:28 +02:00
this . bit ( 0x7f , 0 ) ;
2017-06-23 03:54:44 +02:00
}
2020-09-17 17:37:28 +02:00
else if ( dispData < 100 )
{
2017-06-28 06:13:59 +02:00
this . bit ( dispData % 10 , 3 ) ;
2020-09-17 17:37:28 +02:00
if ( dispData > 90 ) {
this . bit ( 9 , 2 ) ;
} else {
this . bit ( Math . floor ( dispData / 10 ) % 10 , 2 ) ;
}
2017-06-28 06:13:59 +02:00
this . bit ( 0x7f , 1 ) ;
this . bit ( 0x7f , 0 ) ;
2017-06-23 03:54:44 +02:00
}
2020-09-17 17:37:28 +02:00
else if ( dispData < 1000 )
{
2017-06-28 06:13:59 +02:00
this . bit ( dispData % 10 , 3 ) ;
2020-09-17 17:37:28 +02:00
if ( compare_01 > 90 ) {
this . bit ( 9 , 2 ) ;
} else {
this . bit ( Math . floor ( dispData / 10 ) % 10 , 2 ) ;
}
if ( compare_001 > 900 ) {
this . bit ( 9 , 1 ) ;
} else {
this . bit ( Math . floor ( dispData / 100 ) % 10 , 1 ) ;
}
2017-06-28 06:13:59 +02:00
this . bit ( 0x7f , 0 ) ;
2017-06-23 03:54:44 +02:00
}
2020-09-17 17:37:28 +02:00
else if ( dispData < 10000 )
{
2017-06-28 06:13:59 +02:00
this . bit ( dispData % 10 , 3 ) ;
2020-09-17 17:37:28 +02:00
if ( compare_01 > 90 ) {
this . bit ( 9 , 2 ) ;
} else {
this . bit ( Math . floor ( dispData / 10 ) % 10 , 2 ) ;
}
if ( compare_001 > 900 ) {
this . bit ( 9 , 1 ) ;
} else {
this . bit ( Math . floor ( dispData / 100 ) % 10 , 1 ) ;
}
if ( dispData > 9000 ) {
this . bit ( 9 , 0 ) ;
} else {
this . bit ( Math . floor ( dispData / 1000 ) % 10 , 0 ) ;
}
}
else
{
this . bit ( 9 , 3 ) ;
this . bit ( 9 , 2 ) ;
this . bit ( 9 , 1 ) ;
this . bit ( 9 , 0 ) ;
2017-06-23 03:54:44 +02:00
}
}
2020-09-17 17:37:28 +02:00
2017-06-23 03:54:44 +02:00
/ * *
* Set the brightness level of display at from 0 to 7
2020-09-17 17:37:28 +02:00
* @param level value of brightness light level
2017-06-23 03:54:44 +02:00
* /
2020-09-17 17:46:57 +02:00
//% blockId=grove_tm1637_set_display_level block="%4Digit|brightness level to|%level"
2017-06-23 03:54:44 +02:00
//% level.min=0 level.max=7
2020-09-17 18:22:51 +02:00
//% group="4-Digit"
2020-09-17 17:37:28 +02:00
set ( level : number )
{
2017-06-23 03:54:44 +02:00
this . brightnessLevel = level ;
2020-09-17 17:37:28 +02:00
2017-10-23 04:23:08 +02:00
this . bit ( this . buf [ 0 ] , 0x00 ) ;
this . bit ( this . buf [ 1 ] , 0x01 ) ;
this . bit ( this . buf [ 2 ] , 0x02 ) ;
this . bit ( this . buf [ 3 ] , 0x03 ) ;
2017-06-23 03:54:44 +02:00
}
2020-09-17 17:37:28 +02:00
2017-06-23 03:54:44 +02:00
/ * *
* Show a single number from 0 to 9 at a specified digit of Grove - 4 - Digit Display
* @param dispData value of number
2017-06-23 14:00:58 +02:00
* @param bitAddr value of bit number
2017-06-23 03:54:44 +02:00
* /
2020-09-17 17:46:57 +02:00
//% blockId=grove_tm1637_display_bit block="%4Digit|show single number|%dispData|at digit|%bitAddr"
2017-06-23 03:54:44 +02:00
//% dispData.min=0 dispData.max=9
2017-06-23 14:00:58 +02:00
//% bitAddr.min=0 bitAddr.max=3
2020-09-17 18:22:51 +02:00
//% group="4-Digit"
2020-09-17 17:37:28 +02:00
bit ( dispData : number , bitAddr : number )
{
if ( ( dispData == 0x7f ) || ( ( dispData <= 9 ) && ( bitAddr <= 3 ) ) )
{
2017-10-23 04:23:08 +02:00
let segData = 0 ;
2020-09-17 17:37:28 +02:00
2017-10-23 04:23:08 +02:00
segData = this . coding ( dispData ) ;
this . start ( ) ;
this . writeByte ( 0x44 ) ;
this . stop ( ) ;
this . start ( ) ;
this . writeByte ( bitAddr | 0xc0 ) ;
this . writeByte ( segData ) ;
this . stop ( ) ;
this . start ( ) ;
this . writeByte ( 0x88 + this . brightnessLevel ) ;
this . stop ( ) ;
2020-09-17 17:37:28 +02:00
2017-10-23 04:23:08 +02:00
this . buf [ bitAddr ] = dispData ;
}
2017-06-23 03:54:44 +02:00
}
2020-09-17 17:37:28 +02:00
2017-06-23 03:54:44 +02:00
/ * *
* Turn on or off the colon point on Grove - 4 - Digit Display
* @param pointEn value of point switch
* /
2020-09-17 17:46:57 +02:00
//% blockId=grove_tm1637_display_point block="%4Digit|turn|%point|colon point"
2020-09-17 18:22:51 +02:00
//% group="4-Digit"
2020-09-17 17:37:28 +02:00
point ( point : boolean )
{
2017-06-23 03:54:44 +02:00
this . pointFlag = point ;
2020-09-17 17:37:28 +02:00
2017-10-23 04:23:08 +02:00
this . bit ( this . buf [ 0 ] , 0x00 ) ;
this . bit ( this . buf [ 1 ] , 0x01 ) ;
this . bit ( this . buf [ 2 ] , 0x02 ) ;
this . bit ( this . buf [ 3 ] , 0x03 ) ;
2017-06-23 03:54:44 +02:00
}
2020-09-17 17:37:28 +02:00
2017-06-23 03:54:44 +02:00
/ * *
* Clear the display
* /
2020-09-17 17:46:57 +02:00
//% blockId=grove_tm1637_display_clear block="%4Digit|clear"
2020-09-17 18:22:51 +02:00
//% group="4-Digit"
2020-09-17 17:37:28 +02:00
clear ( )
{
2017-10-23 04:23:08 +02:00
this . bit ( 0x7f , 0x00 ) ;
this . bit ( 0x7f , 0x01 ) ;
this . bit ( 0x7f , 0x02 ) ;
this . bit ( 0x7f , 0x03 ) ;
2017-06-23 03:54:44 +02:00
}
}
2018-09-14 08:11:57 +02:00
2020-09-17 17:37:28 +02:00
export class GroveJoystick
{
2018-09-14 08:11:57 +02:00
/ * *
* Detect position from Grove - Thumb Joystick
* @param xPin
* @param yPin
* /
2020-09-17 20:47:07 +02:00
2020-09-17 18:06:05 +02:00
joyread ( xPin : AnalogPin , yPin : AnalogPin ) : number {
2020-09-17 21:42:16 +02:00
2018-09-14 08:11:57 +02:00
let xdata = 0 , ydata = 0 , result = 0 ;
if ( xPin && yPin ) {
xdata = pins . analogReadPin ( xPin ) ;
ydata = pins . analogReadPin ( yPin ) ;
if ( xdata > 1000 ) {
result = GroveJoystickKey . Press ;
}
else if ( xdata > 600 ) {
if ( ydata > 600 ) result = GroveJoystickKey . UR ;
else if ( ydata < 400 ) result = GroveJoystickKey . LR ;
else result = GroveJoystickKey . Right ;
}
else if ( xdata < 400 ) {
if ( ydata > 600 ) result = GroveJoystickKey . UL ;
else if ( ydata < 400 ) result = GroveJoystickKey . LL ;
else result = GroveJoystickKey . Left ;
}
else {
if ( ydata > 600 ) result = GroveJoystickKey . Up ;
else if ( ydata < 400 ) result = GroveJoystickKey . Down ;
else result = GroveJoystickKey . None ;
}
}
else {
2020-09-17 17:37:28 +02:00
result = GroveJoystickKey . None ;
2018-09-14 08:11:57 +02:00
}
return result ;
}
}
2020-09-17 17:37:28 +02:00
2019-07-30 10:10:22 +02:00
const gestureEventId = 3100 ;
const joystickEventID = 3101 ;
let lastGesture = GroveGesture . None ;
let lastJoystick = GroveJoystickKey . None ;
let distanceBackup : number = 0 ;
let joystick = new GroveJoystick ( ) ;
let paj7620 = new PAJ7620 ( ) ;
2020-09-17 20:52:45 +02:00
// adapted to Calliope mini V2 Core by M.Klein 17.09.2020
2020-12-14 13:03:00 +01:00
/ * *
* Create a new driver of Grove - Ultrasonic Sensor to measure distances in cm
* @param pin signal pin of ultrasonic ranger module
* /
2020-12-17 10:33:09 +01:00
//% blockId=grove_ultrasonic_centimeters_v2 block="(V2)Ultrasonic Sensor (in cm) at|%pin"
2020-12-14 13:03:00 +01:00
//% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4
//% pin.fieldOptions.tooltips="false" pin.fieldOptions.width="250"
//% group="Ultrasonic" pin.defl=DigitalPin.C16
export function measureInCentimetersV2 ( pin : DigitalPin ) : number
{
let duration = 0 ;
let RangeInCentimeters = 0 ;
pins . digitalWritePin ( pin , 0 ) ;
control . waitMicros ( 2 ) ;
pins . digitalWritePin ( pin , 1 ) ;
control . waitMicros ( 20 ) ;
pins . digitalWritePin ( pin , 0 ) ;
duration = pins . pulseIn ( pin , PulseValue . High , 50000 ) ; // Max duration 50 ms
RangeInCentimeters = duration * 153 / 44 / 2 / 100 ;
if ( RangeInCentimeters > 0 ) distanceBackup = RangeInCentimeters ;
else RangeInCentimeters = distanceBackup ;
2020-09-17 20:52:45 +02:00
2020-12-14 13:03:00 +01:00
basic . pause ( 50 ) ;
return RangeInCentimeters ;
}
/ * *
* Create a new driver Grove - Ultrasonic Sensor to measure distances in inch
* @param pin signal pin of ultrasonic ranger module
* /
2020-12-17 10:33:09 +01:00
//% blockId=grove_ultrasonic_inches_v2 block="(V2)Ultrasonic Sensor (in inch) at|%pin"
2020-12-14 13:03:00 +01:00
//% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4
//% pin.fieldOptions.tooltips="false" pin.fieldOptions.width="250"
//% group="Ultrasonic" pin.defl=DigitalPin.C16
export function measureInInchesV2 ( pin : DigitalPin ) : number
{
let duration = 0 ;
let RangeInInches = 0 ;
pins . digitalWritePin ( pin , 0 ) ;
control . waitMicros ( 2 ) ;
pins . digitalWritePin ( pin , 1 ) ;
control . waitMicros ( 20 ) ;
pins . digitalWritePin ( pin , 0 ) ;
duration = pins . pulseIn ( pin , PulseValue . High , 100000 ) ; // Max duration 100 ms
RangeInInches = duration * 153 / 113 / 2 / 100 ;
if ( RangeInInches > 0 ) distanceBackup = RangeInInches ;
else RangeInInches = distanceBackup ;
basic . pause ( 50 ) ;
return RangeInInches ;
}
2019-07-30 10:10:22 +02:00
/ * *
* Create a new driver of Grove - Ultrasonic Sensor to measure distances in cm
* @param pin signal pin of ultrasonic ranger module
* /
//% blockId=grove_ultrasonic_centimeters block="Ultrasonic Sensor (in cm) at|%pin"
2020-09-17 17:37:28 +02:00
//% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4
//% pin.fieldOptions.tooltips="false" pin.fieldOptions.width="250"
2020-09-17 18:55:21 +02:00
//% group="Ultrasonic" pin.defl=DigitalPin.C16
2020-09-17 21:42:16 +02:00
2020-09-17 17:37:28 +02:00
export function measureInCentimeters ( pin : DigitalPin ) : number
{
2019-07-30 10:10:22 +02:00
let duration = 0 ;
let RangeInCentimeters = 0 ;
2020-09-17 17:37:28 +02:00
2019-07-30 10:10:22 +02:00
pins . digitalWritePin ( pin , 0 ) ;
control . waitMicros ( 2 ) ;
pins . digitalWritePin ( pin , 1 ) ;
control . waitMicros ( 20 ) ;
2020-09-17 17:37:28 +02:00
pins . digitalWritePin ( pin , 0 ) ;
2019-07-30 10:10:22 +02:00
duration = pins . pulseIn ( pin , PulseValue . High , 50000 ) ; // Max duration 50 ms
2018-09-14 08:11:57 +02:00
2019-07-30 10:10:22 +02:00
RangeInCentimeters = duration * 153 / 29 / 2 / 100 ;
2020-09-17 17:37:28 +02:00
if ( RangeInCentimeters > 0 ) distanceBackup = RangeInCentimeters ;
2019-07-30 10:10:22 +02:00
else RangeInCentimeters = distanceBackup ;
basic . pause ( 50 ) ;
2020-09-17 17:37:28 +02:00
2019-07-30 10:10:22 +02:00
return RangeInCentimeters ;
}
2020-09-17 17:37:28 +02:00
2019-07-30 10:10:22 +02:00
/ * *
* Create a new driver Grove - Ultrasonic Sensor to measure distances in inch
* @param pin signal pin of ultrasonic ranger module
* /
//% blockId=grove_ultrasonic_inches block="Ultrasonic Sensor (in inch) at|%pin"
2020-09-17 17:37:28 +02:00
//% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4
//% pin.fieldOptions.tooltips="false" pin.fieldOptions.width="250"
2020-09-17 19:03:09 +02:00
//% group="Ultrasonic" pin.defl=DigitalPin.C16
2020-09-17 17:37:28 +02:00
export function measureInInches ( pin : DigitalPin ) : number
{
2019-07-30 10:10:22 +02:00
let duration = 0 ;
let RangeInInches = 0 ;
2020-09-17 17:37:28 +02:00
2019-07-30 10:10:22 +02:00
pins . digitalWritePin ( pin , 0 ) ;
control . waitMicros ( 2 ) ;
pins . digitalWritePin ( pin , 1 ) ;
control . waitMicros ( 20 ) ;
2020-09-17 17:37:28 +02:00
pins . digitalWritePin ( pin , 0 ) ;
2019-07-30 10:10:22 +02:00
duration = pins . pulseIn ( pin , PulseValue . High , 100000 ) ; // Max duration 100 ms
2020-09-17 17:37:28 +02:00
2019-07-30 10:10:22 +02:00
RangeInInches = duration * 153 / 74 / 2 / 100 ;
2020-09-17 17:37:28 +02:00
if ( RangeInInches > 0 ) distanceBackup = RangeInInches ;
2019-07-30 10:10:22 +02:00
else RangeInInches = distanceBackup ;
2020-09-17 17:37:28 +02:00
2019-07-30 10:10:22 +02:00
basic . pause ( 50 ) ;
2020-09-17 17:37:28 +02:00
2019-07-30 10:10:22 +02:00
return RangeInInches ;
}
2020-09-17 17:37:28 +02:00
2019-07-30 10:10:22 +02:00
/ * *
* Create a new driver Grove - 4 - Digit Display
* @param clkPin value of clk pin number
* @param dataPin value of data pin number
* /
//% blockId=grove_tm1637_create block="4-Digit Display at|%clkPin|and|%dataPin"
2020-09-17 17:37:28 +02:00
//% clkPin.fieldEditor="gridpicker" clkPin.fieldOptions.columns=4
2020-09-17 18:22:51 +02:00
//% group="4-Digit"
2020-09-17 17:37:28 +02:00
//% clkPin.fieldOptions.tooltips="false" clkPin.fieldOptions.width="250"
//% dataPin.fieldEditor="gridpicker" dataPin.fieldOptions.columns=4
2020-09-17 19:03:09 +02:00
//% clkPin.defl=DigitalPin.C16 dataPin.defl=DigitalPin.C17
2020-09-17 17:37:28 +02:00
//% dataPin.fieldOptions.tooltips="false" dataPin.fieldOptions.width="250"
2020-09-22 16:08:13 +02:00
//% blockSetVariable=4digit
2020-09-17 17:37:28 +02:00
export function createDisplay ( clkPin : DigitalPin , dataPin : DigitalPin ) : TM1637
{
2019-07-30 10:10:22 +02:00
let display = new TM1637 ( ) ;
2020-09-17 17:37:28 +02:00
2019-07-30 10:10:22 +02:00
display . buf = pins . createBuffer ( 4 ) ;
display . clkPin = clkPin ;
display . dataPin = dataPin ;
display . brightnessLevel = 0 ;
display . pointFlag = false ;
display . clear ( ) ;
2020-09-17 17:37:28 +02:00
2019-07-30 10:10:22 +02:00
return display ;
}
2020-09-17 17:37:28 +02:00
2019-07-30 10:10:22 +02:00
/ * *
2019-07-31 09:23:52 +02:00
* init Grove Gesture module s
*
2019-07-30 10:10:22 +02:00
* /
2019-07-31 09:23:52 +02:00
//% blockId=grove_initgesture block="init gesture"
2020-09-17 18:44:38 +02:00
//% group="Gesture"
2019-07-31 09:23:52 +02:00
export function initGesture() {
2019-07-30 10:10:22 +02:00
if ( ! paj7620 ) {
paj7620 . init ( ) ;
}
}
2018-09-14 08:11:57 +02:00
2019-07-30 10:10:22 +02:00
/ * *
2020-09-17 17:51:13 +02:00
* get Grove Gesture model
2019-07-31 09:23:52 +02:00
*
2019-07-30 10:10:22 +02:00
* /
2019-07-31 09:23:52 +02:00
//% blockId=grove_getgesture block="get gesture model"
2020-09-17 18:31:59 +02:00
//% group="Gesture"
2019-07-31 09:23:52 +02:00
export function getGestureModel ( ) : number {
return paj7620 . read ( ) ;
}
/ * *
* get Joystick key
*
* /
2020-09-17 17:37:28 +02:00
//% blockId=grove_getjoystick block="get joystick key at|%xpin|and|%ypin"
2020-09-17 19:03:09 +02:00
//% group="Thumbjoystick" xpin.defl=AnalogPin.C16 ypin.defl=AnalogPin.C17
2019-07-31 09:23:52 +02:00
export function getJoystick ( xpin : AnalogPin , ypin : AnalogPin ) : number {
2020-09-17 18:06:05 +02:00
return joystick . joyread ( xpin , ypin ) ;
2019-07-30 10:10:22 +02:00
}
2019-07-31 09:23:52 +02:00
2020-09-17 22:14:57 +02:00
/ * *
* Converts the gesture name to a number
* Useful for comparisons
* /
//% blockId=ggesture block="%key"
2020-09-17 22:18:34 +02:00
//% group="Gesture"
2020-09-17 22:14:57 +02:00
export function ggesture ( g : GroveGesture ) : number {
return g ;
}
2019-07-31 10:52:21 +02:00
/ * *
* Do something when a gesture is detected by Grove - Gesture
* @param gesture type of gesture to detect
* @param handler code to run
* /
//% blockId=grove_gesture_create_event block="on Gesture|%gesture"
2020-09-17 18:31:59 +02:00
//% group="Gesture"
2019-07-31 10:52:21 +02:00
export function onGesture ( gesture : GroveGesture , handler : ( ) = > void ) {
control . onEvent ( gestureEventId , gesture , handler ) ;
paj7620 . init ( ) ;
control . inBackground ( ( ) = > {
2020-09-17 17:37:28 +02:00
while ( true ) {
2019-07-31 10:52:21 +02:00
const gesture = paj7620 . read ( ) ;
if ( gesture != lastGesture ) {
lastGesture = gesture ;
control . raiseEvent ( gestureEventId , lastGesture ) ;
}
basic . pause ( 50 ) ;
}
} )
}
2020-09-17 21:11:26 +02:00
/ * *
* Converts the key name to a number
* Useful for comparisons
* /
//% blockId=joystickkey block="%key"
2020-09-17 22:18:34 +02:00
//% group="Thumbjoystick"
2020-09-17 21:11:26 +02:00
export function joystickkey ( key : GroveJoystickKey ) : number {
return key ;
}
2019-07-31 10:52:21 +02:00
/ * *
* Do something when a key is detected by Grove - Thumb Joystick
* @param key type of joystick to detect
* @param xpin
* @param ypin
* @param handler code to run
* /
2020-09-17 17:37:28 +02:00
//% blockId=grove_joystick_create_event block="on Key|%key at |%xpin|and|%ypin"
2020-09-17 19:03:09 +02:00
//% group="Thumbjoystick" xpin.defl=AnalogPin.C16 ypin.defl=AnalogPin.C17
2020-09-17 21:42:16 +02:00
2019-07-31 10:52:21 +02:00
export function onJoystick ( key : GroveJoystickKey , xpin : AnalogPin , ypin : AnalogPin , handler : ( ) = > void ) {
control . onEvent ( joystickEventID , key , handler ) ;
control . inBackground ( ( ) = > {
2020-09-17 17:37:28 +02:00
while ( true ) {
2020-09-17 18:06:05 +02:00
const key = joystick . joyread ( xpin , ypin ) ;
2019-07-31 10:52:21 +02:00
if ( key != lastJoystick ) {
2020-09-17 17:37:28 +02:00
lastJoystick = key ;
2019-07-31 10:52:21 +02:00
control . raiseEvent ( joystickEventID , lastJoystick ) ;
}
basic . pause ( 50 ) ;
}
} )
2020-09-17 17:37:28 +02:00
2019-07-31 10:52:21 +02:00
}
2020-10-12 14:55:42 +02:00
let isWifiConnected = false ;
/ * *
* Setup Grove - Uart WiFi V2 to connect to Wi - Fi
* /
//% block="Setup Wifi|TX %txPin|RX %rxPin|Baud rate %baudrate|SSID = %ssid|Password = %passwd"
//% group="UartWiFi"
//% txPin.defl=SerialPin.P15
//% rxPin.defl=SerialPin.P1
//% baudRate.defl=BaudRate.BaudRate115200
export function setupWifi ( txPin : SerialPin , rxPin : SerialPin , baudRate : BaudRate , ssid : string , passwd : string ) {
let result = 0
isWifiConnected = false
serial . redirect (
txPin ,
rxPin ,
baudRate
)
sendAtCmd ( "AT" )
result = waitAtResponse ( "OK" , "ERROR" , "None" , 1000 )
sendAtCmd ( "AT+CWMODE=1" )
result = waitAtResponse ( "OK" , "ERROR" , "None" , 1000 )
sendAtCmd ( ` AT+CWJAP=" ${ ssid } "," ${ passwd } " ` )
result = waitAtResponse ( "WIFI GOT IP" , "ERROR" , "None" , 20000 )
if ( result == 1 ) {
isWifiConnected = true
}
}
/ * *
* Check if Grove - Uart WiFi V2 is connected to Wifi
* /
//% block="Wifi OK?"
//% group="UartWiFi"
export function wifiOK() {
return isWifiConnected
}
/ * *
* Send data to ThinkSpeak
* /
2023-07-18 11:10:46 +02:00
//% block="Send Data to your ThingSpeak Channel|Write API Key %apiKey|Field1 %field1|Field2 %field2|Field3 %field3|Field4 %field4|Field5 %field5|Field6 %field6|Field7 %field7|Field8 %field8"
2020-10-12 14:55:42 +02:00
//% group="UartWiFi"
//% apiKey.defl="your Write API Key"
export function sendToThinkSpeak ( apiKey : string , field1 : number , field2 : number , field3 : number , field4 : number , field5 : number , field6 : number , field7 : number , field8 : number ) {
let result = 0
let retry = 2
// close the previous TCP connection
if ( isWifiConnected ) {
sendAtCmd ( "AT+CIPCLOSE" )
waitAtResponse ( "OK" , "ERROR" , "None" , 2000 )
}
while ( isWifiConnected && retry > 0 ) {
retry = retry - 1 ;
// establish TCP connection
2023-07-18 11:10:46 +02:00
sendAtCmd ( "AT+CIPSTART=\"TCP\",\"iot.rlp.schule\",80" )
2020-10-12 14:55:42 +02:00
result = waitAtResponse ( "OK" , "ALREADY CONNECTED" , "ERROR" , 2000 )
if ( result == 3 ) continue
let data = "GET /update?api_key=" + apiKey
if ( ! isNaN ( field1 ) ) data = data + "&field1=" + field1
if ( ! isNaN ( field2 ) ) data = data + "&field2=" + field2
if ( ! isNaN ( field3 ) ) data = data + "&field3=" + field3
if ( ! isNaN ( field4 ) ) data = data + "&field4=" + field4
if ( ! isNaN ( field5 ) ) data = data + "&field5=" + field5
if ( ! isNaN ( field6 ) ) data = data + "&field6=" + field6
if ( ! isNaN ( field7 ) ) data = data + "&field7=" + field7
if ( ! isNaN ( field8 ) ) data = data + "&field8=" + field8
sendAtCmd ( "AT+CIPSEND=" + ( data . length + 2 ) )
result = waitAtResponse ( ">" , "OK" , "ERROR" , 2000 )
if ( result == 3 ) continue
sendAtCmd ( data )
result = waitAtResponse ( "SEND OK" , "SEND FAIL" , "ERROR" , 5000 )
// // close the TCP connection
// sendAtCmd("AT+CIPCLOSE")
// waitAtResponse("OK", "ERROR", "None", 2000)
if ( result == 1 ) break
}
}
/ * *
* Send data to IFTTT
* /
//% block="Send Data to your IFTTT Event|Event %event|Key %key|value1 %value1|value2 %value2|value3 %value3"
//% group="UartWiFi"
//% event.defl="your Event"
//% key.defl="your Key"
//% value1.defl="hello"
//% value2.defl="micro"
//% value3.defl="bit"
export function sendToIFTTT ( event : string , key : string , value1 : string , value2 : string , value3 : string ) {
let result = 0
let retry = 2
// close the previous TCP connection
if ( isWifiConnected ) {
sendAtCmd ( "AT+CIPCLOSE" )
waitAtResponse ( "OK" , "ERROR" , "None" , 2000 )
}
while ( isWifiConnected && retry > 0 ) {
retry = retry - 1 ;
// establish TCP connection
sendAtCmd ( "AT+CIPSTART=\"TCP\",\"maker.ifttt.com\",80" )
result = waitAtResponse ( "OK" , "ALREADY CONNECTED" , "ERROR" , 2000 )
if ( result == 3 ) continue
let data = "GET /trigger/" + event + "/with/key/" + key
data = data + "?value1=" + value1
data = data + "&value2=" + value2
data = data + "&value3=" + value3
data = data + " HTTP/1.1"
data = data + "\u000D\u000A"
data = data + "User-Agent: curl/7.58.0"
data = data + "\u000D\u000A"
data = data + "Host: maker.ifttt.com"
data = data + "\u000D\u000A"
data = data + "Accept: */*"
data = data + "\u000D\u000A"
sendAtCmd ( "AT+CIPSEND=" + ( data . length + 2 ) )
result = waitAtResponse ( ">" , "OK" , "ERROR" , 2000 )
if ( result == 3 ) continue
sendAtCmd ( data )
result = waitAtResponse ( "SEND OK" , "SEND FAIL" , "ERROR" , 5000 )
// // close the TCP connection
// sendAtCmd("AT+CIPCLOSE")
// waitAtResponse("OK", "ERROR", "None", 2000)
if ( result == 1 ) break
}
}
function waitAtResponse ( target1 : string , target2 : string , target3 : string , timeout : number ) {
let buffer = ""
let start = input . runningTime ( )
while ( ( input . runningTime ( ) - start ) < timeout ) {
buffer += serial . readString ( )
if ( buffer . includes ( target1 ) ) return 1
if ( buffer . includes ( target2 ) ) return 2
if ( buffer . includes ( target3 ) ) return 3
basic . pause ( 100 )
}
return 0
}
function sendAtCmd ( cmd : string ) {
serial . writeString ( cmd + "\u000D\u000A" )
}
2020-12-14 13:03:00 +01:00
}