Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
445e3e2103 | |||
|
e1e2634801 | ||
|
c585249c82 | ||
|
6f841cdabc | ||
|
1548cd4b9c |
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2021 Seeed Studio
|
||||||
|
|
||||||
|
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.
|
@ -20,5 +20,8 @@
|
|||||||
"grove.TM1637.set|block": "%strip|[Grove - 4桁ディスプレイ]|明るさを|%level|に変更する",
|
"grove.TM1637.set|block": "%strip|[Grove - 4桁ディスプレイ]|明るさを|%level|に変更する",
|
||||||
"grove.TM1637.bit|block": "%strip|[Grove - 4桁ディスプレイ]|%dispData|を|%bitAddr|桁目に表示する",
|
"grove.TM1637.bit|block": "%strip|[Grove - 4桁ディスプレイ]|%dispData|を|%bitAddr|桁目に表示する",
|
||||||
"grove.TM1637.point|block": "%strip|[Grove - 4桁ディスプレイ]|コロンの表示を|%point|に変更する",
|
"grove.TM1637.point|block": "%strip|[Grove - 4桁ディスプレイ]|コロンの表示を|%point|に変更する",
|
||||||
"grove.TM1637.clear|block": "%strip|[Grove - 4桁ディスプレイ]|表示を消す"
|
"grove.TM1637.clear|block": "%strip|[Grove - 4桁ディスプレイ]|表示を消す",
|
||||||
}
|
"grove.aht20ReadTemperatureC|block": "[Grove - 温湿度センサー]|温度(℃)を読み取る",
|
||||||
|
"grove.aht20ReadTemperatureF|block": "[Grove - 温湿度センサー]|温度(℉)を読み取る",
|
||||||
|
"grove.aht20ReadHumidity|block": "[Grove - 温湿度センサー]|湿度を読み取る"
|
||||||
|
}
|
||||||
|
71
blocks/GroveAHT20.ts
Normal file
71
blocks/GroveAHT20.ts
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
/**
|
||||||
|
* Grove - AHT20 Custom Block
|
||||||
|
*/
|
||||||
|
//% groups=['AHT20']
|
||||||
|
namespace grove
|
||||||
|
{
|
||||||
|
function Read(aht20: grove.sensors.AHT20): { Humidity: number, Temperature: number }
|
||||||
|
{
|
||||||
|
if (!aht20.GetState().Calibrated)
|
||||||
|
{
|
||||||
|
aht20.Initialization();
|
||||||
|
if (!aht20.GetState().Calibrated) return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
aht20.TriggerMeasurement();
|
||||||
|
for (let i = 0; ; ++i)
|
||||||
|
{
|
||||||
|
if (!aht20.GetState().Busy) break;
|
||||||
|
if (i >= 500) return null;
|
||||||
|
basic.pause(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
return aht20.Read();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read the temperature(°C) from Grove-AHT20(SKU#101990644)
|
||||||
|
*/
|
||||||
|
//% group="AHT20"
|
||||||
|
//% block="[Grove - Temp&Humi Sensor]|Read the temperature(°C))"
|
||||||
|
//% weight=3
|
||||||
|
export function aht20ReadTemperatureC(): number
|
||||||
|
{
|
||||||
|
const aht20 = new grove.sensors.AHT20();
|
||||||
|
const val = Read(aht20);
|
||||||
|
if (val == null) return null;
|
||||||
|
|
||||||
|
return val.Temperature;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read the temperature(°F) from Grove-AHT20(SKU#101990644)
|
||||||
|
*/
|
||||||
|
//% group="AHT20"
|
||||||
|
//% block="[Grove - Temp&Humi Sensor]|Read the temperature(°F))"
|
||||||
|
//% weight=2
|
||||||
|
export function aht20ReadTemperatureF(): number
|
||||||
|
{
|
||||||
|
const aht20 = new grove.sensors.AHT20();
|
||||||
|
const val = Read(aht20);
|
||||||
|
if (val == null) return null;
|
||||||
|
|
||||||
|
return val.Temperature * 9 / 5 + 32;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read the humidity from Grove-AHT20(SKU#101990644)
|
||||||
|
*/
|
||||||
|
//% group="AHT20"
|
||||||
|
//% block="[Grove - Temp&Humi Sensor]|Read the humidity"
|
||||||
|
//% weight=1
|
||||||
|
export function aht20ReadHumidity(): number
|
||||||
|
{
|
||||||
|
const aht20 = new grove.sensors.AHT20();
|
||||||
|
const val = Read(aht20);
|
||||||
|
if (val == null) return null;
|
||||||
|
|
||||||
|
return val.Humidity;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
4
main.ts
4
main.ts
@ -746,7 +746,7 @@ namespace grove {
|
|||||||
/**
|
/**
|
||||||
* Send data to ThinkSpeak
|
* Send data to ThinkSpeak
|
||||||
*/
|
*/
|
||||||
//% block="Send Data to your ThinkSpeak Channel|Write API Key %apiKey|Field1 %field1|Field2 %field2|Field3 %field3|Field4 %field4|Field5 %field5|Field6 %field6|Field7 %field7|Field8 %field8"
|
//% 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"
|
||||||
//% group="UartWiFi"
|
//% group="UartWiFi"
|
||||||
//% apiKey.defl="your Write API Key"
|
//% 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) {
|
export function sendToThinkSpeak(apiKey: string, field1: number, field2: number, field3: number, field4: number, field5: number, field6: number, field7: number, field8: number) {
|
||||||
@ -762,7 +762,7 @@ namespace grove {
|
|||||||
while (isWifiConnected && retry > 0) {
|
while (isWifiConnected && retry > 0) {
|
||||||
retry = retry - 1;
|
retry = retry - 1;
|
||||||
// establish TCP connection
|
// establish TCP connection
|
||||||
sendAtCmd("AT+CIPSTART=\"TCP\",\"api.thingspeak.com\",80")
|
sendAtCmd("AT+CIPSTART=\"TCP\",\"iot.rlp.schule\",80")
|
||||||
result = waitAtResponse("OK", "ALREADY CONNECTED", "ERROR", 2000)
|
result = waitAtResponse("OK", "ALREADY CONNECTED", "ERROR", 2000)
|
||||||
if (result == 3) continue
|
if (result == 3) continue
|
||||||
|
|
||||||
|
6
pxt.json
6
pxt.json
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "Grove",
|
"name": "Grove",
|
||||||
"version": "0.4.0",
|
"version": "0.5.0",
|
||||||
"description": "A Microsoft MakeCode package for Seeed Studio Grove module",
|
"description": "A Microsoft MakeCode package for Seeed Studio Grove module",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@ -9,8 +9,10 @@
|
|||||||
"files": [
|
"files": [
|
||||||
"README.md",
|
"README.md",
|
||||||
"main.ts",
|
"main.ts",
|
||||||
|
"blocks/GroveAHT20.ts",
|
||||||
"_locales/ja/Grove-strings.json",
|
"_locales/ja/Grove-strings.json",
|
||||||
"_locales/de/Grove-strings.json"
|
"_locales/de/Grove-strings.json",
|
||||||
|
"sensors/AHT20.ts"
|
||||||
],
|
],
|
||||||
"testFiles": [
|
"testFiles": [
|
||||||
"test.ts"
|
"test.ts"
|
||||||
|
87
sensors/AHT20.ts
Normal file
87
sensors/AHT20.ts
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
namespace grove
|
||||||
|
{
|
||||||
|
export namespace sensors
|
||||||
|
{
|
||||||
|
|
||||||
|
export class AHT20
|
||||||
|
{
|
||||||
|
public constructor(address: number = 0x38)
|
||||||
|
{
|
||||||
|
this._Address = address;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Initialization(): AHT20
|
||||||
|
{
|
||||||
|
const buf = pins.createBuffer(3);
|
||||||
|
buf[0] = 0xbe;
|
||||||
|
buf[1] = 0x08;
|
||||||
|
buf[2] = 0x00;
|
||||||
|
pins.i2cWriteBuffer(this._Address, buf, false);
|
||||||
|
basic.pause(10);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TriggerMeasurement(): AHT20
|
||||||
|
{
|
||||||
|
const buf = pins.createBuffer(3);
|
||||||
|
buf[0] = 0xac;
|
||||||
|
buf[1] = 0x33;
|
||||||
|
buf[2] = 0x00;
|
||||||
|
pins.i2cWriteBuffer(this._Address, buf, false);
|
||||||
|
basic.pause(80);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GetState(): { Busy: boolean, Calibrated: boolean }
|
||||||
|
{
|
||||||
|
const buf = pins.i2cReadBuffer(this._Address, 1, false);
|
||||||
|
const busy = buf[0] & 0x80 ? true : false;
|
||||||
|
const calibrated = buf[0] & 0x08 ? true : false;
|
||||||
|
|
||||||
|
return { Busy: busy, Calibrated: calibrated };
|
||||||
|
}
|
||||||
|
|
||||||
|
public Read(): { Humidity: number, Temperature: number }
|
||||||
|
{
|
||||||
|
const buf = pins.i2cReadBuffer(this._Address, 7, false);
|
||||||
|
|
||||||
|
const crc8 = AHT20.CalcCRC8(buf, 0, 6);
|
||||||
|
if (buf[6] != crc8) return null;
|
||||||
|
|
||||||
|
const humidity = ((buf[1] << 12) + (buf[2] << 4) + (buf[3] >> 4)) * 100 / 1048576;
|
||||||
|
const temperature = (((buf[3] & 0x0f) << 16) + (buf[4] << 8) + buf[5]) * 200 / 1048576 - 50;
|
||||||
|
|
||||||
|
return { Humidity: humidity, Temperature: temperature };
|
||||||
|
}
|
||||||
|
|
||||||
|
private _Address: number;
|
||||||
|
|
||||||
|
private static CalcCRC8(buf: Buffer, offset: number, size: number): number
|
||||||
|
{
|
||||||
|
let crc8 = 0xff;
|
||||||
|
for (let i = 0; i < size; ++i)
|
||||||
|
{
|
||||||
|
crc8 ^= buf[offset + i];
|
||||||
|
for (let j = 0; j < 8; ++j)
|
||||||
|
{
|
||||||
|
if (crc8 & 0x80)
|
||||||
|
{
|
||||||
|
crc8 <<= 1;
|
||||||
|
crc8 ^= 0x31;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
crc8 <<= 1;
|
||||||
|
}
|
||||||
|
crc8 &= 0xff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return crc8;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user