Hardware components | ||||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
Hand tools and fabrication machines | ||||||
|
The bicycle is chosen by many people for travel. Many aspects can affect users of this vehicle, including climate, pollution and thieves.
I believe that all these problems can be solved by a single integrated device that works as a mobile weather station, an air quality analyzer, an anti-theft system and possibly all the things that can come in handy.
One of the main goal of this project is to obtain weather informations from the bike while the user is still at home, providing him all the necessary informations to start the day in the best way.
Rapid IoT configuration1. Register an account or login at https://rapid-iot-studio.nxp.com.
2. Download SmartElectricBike.atmo file from below.
3. Import the file in your NXP Rapid IoT Dashboard.
4. Compile the project (blue arrow), wait untile "Project has been compiled" appears and press the download button (green arrow).
5. Plug-in the Rapid IoT device to your PC/MAC and prepare it as follows:
6. Drag and drop the firmware that was downloaded from step 4 to the newly mounted drive. Device should reset after a minute or less.
App configuration1. Download the "NXP Rapid IOT" app from the app store of your device.
2. Log-in with the same account you used in the NXP Rapid IoT Dashboard in step 1.
3. Click "Add device", select your device and press "Provision".
4. Click the "Widget dashboard" icon to open the application interface.
Bike mountingThe bike mounting is provided below in STL format. The print will take about 20 minutes with 0.3 layer height and 10% infill.
Once printed the part has to be fixed by screws to the Rapid IoT, then a cable tie must be passed through the central hole.
The system application includes four pages.
- Main page (battery status and info);
- Weather (temperature and humidity);
- Forecast (pressure and short term forecast);
- Air quality (ppm value);
In the application visible from the smartphone are shown the values of temperature, humidity and air quality, as well as the activation buttons of the anti-theft system and the related notification.
The device should last about 3 hours. For this reason I created an expansion equipped with a photovoltaic panel able to recharge the device. It is optional, but the two holes provided in the mounting are present precisely for this reason.
Once the module has been printed, it is necessary to glue the photovoltaic panel at the top of the frame, and a 5V buck converter below.
Fixing to the mounting is done as before with cable ties.
{
"name": "Smart Electric bike Gadget",
"createVersion": "2017-08-12",
"description": "New Project",
"lastModified": "2018-12-15T18:43:34.784Z",
"created": "2018-12-15T18:43:34.784Z",
"meta": {
"projectTypeName": "NXP Rapid IoT",
"projectTypeId": "NxpRpk"
},
"planes": {
"NXP Rapid IoT": {
"type": "mcuxpresso",
"compilerVersion": "latest",
"variants": [
"NxpRpk"
],
"meta": {},
"elements": [
{
"name": "Slow",
"type": "EmbeddedInterval",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n\tATMO_INTERVAL_Handle_t intervalHandle;\n ATMO_INTERVAL_AddAbilityInterval(\n\t\tATMO_PROPERTY(Slow, instance), \n\t\tATMO_ABILITY(Slow, interval), \n\t\tATMO_PROPERTY(Slow, time), \n\t\t&intervalHandle\n\t);\n\t\n\treturn ATMO_Status_Success;\n\t",
"interval": "\treturn ATMO_Status_Success;"
},
"variables": {},
"embeddedPropertyConversions": {},
"codeUserChanged": {
"setup": false,
"interval": false
},
"instance": 0,
"time": "5000"
},
"meta": {
"editorX": 14,
"editorY": 92,
"lastTrigger": "interval"
},
"triggers": {
"triggered": [],
"interval": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "Temperature",
"targetAbility": "readTemperature"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "Humidity",
"targetAbility": "readHumidity"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "AirQuality",
"targetAbility": "readTVOC"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "AmbientLight",
"targetAbility": "readAmbientLight"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "GetBatteryLevel",
"targetAbility": "trigger"
}
]
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"interval": true
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "interval",
"triggers": [
"interval"
]
}
]
},
{
"name": "Pressure",
"type": "EmbeddedMPL3115",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\tATMO_MPL3115_Config_t config;\n\tconfig.address = ATMO_PROPERTY(Pressure, i2cAddress);\n\tconfig.i2cDriverInstance = ATMO_PROPERTY(Pressure, i2cInstance);\n\tconfig.MPLsettings.mode = MPL_MODE_PRESSURE;\n\tconfig.MPLsettings.oversample = MPL_OS_0;\t\t\t// oversampling = 1\n\tconfig.MPLsettings.autoAcquisitionTime = MPL_ST_0;\t// Auto acquisition time = 1s\n\tconfig.MPLsettings.pressureOffset = ATMO_PROPERTY(Pressure, pressureOffset);\t// Offset pressure correction = 4*-128 = -512Pa (8 bits signed integer)\n\tconfig.MPLsettings.altitudeOffset = ATMO_PROPERTY(Pressure, altitudeOffset);\t// Offset altitude correction = 128m (signed 8 bits integer)\n\tconfig.MPLsettings.tempOffset = ATMO_PROPERTY(Pressure, tempOffset);\t\t\t// Offset temperature correction -8C (0.0625C/LSB)\n\tconfig.MPLsettings.fifoMode = FIFO_DISABLED;\t\t// FIFO mode disabled\n\tconfig.MPLsettings.fifoWatermark = 5;\t\t\t\t// 6 bits to set the number of FIFO samples required to trigger a watermark interrupt.\n\tconfig.MPLsettings.fifoINTpin = FIFO_INT1;\t\t\t// set pin INT1 as output for FIFO interrupt\n\n\treturn ( ATMO_MPL3115_Init(&config) == ATMO_MPL3115_Status_Success ) ? ATMO_Status_Success : ATMO_Status_Fail;\n",
"setEnabled": "ATMO_MPL3115_SetEnabled(true);\nreturn ATMO_Status_Success;",
"setDisabled": "ATMO_MPL3115_SetEnabled(false);\nreturn ATMO_Status_Success;",
"setEnabledDisabled": "bool enabled = false;\nATMO_GetBool(in, &enabled);\nATMO_MPL3115_SetEnabled(enabled);\nreturn ATMO_Status_Success;",
"readAltitude": " uint32_t altitudeMeters;\n if(ATMO_MPL3115_GetAltitude(&altitudeMeters) != ATMO_MPL3115_Status_Success)\n {\n ATMO_CreateValueVoid(out);\n return ATMO_Status_Fail;\n }\n ATMO_CreateValueInt(out, (int)altitudeMeters);\n return ATMO_Status_Success;",
"readPressure": " uint32_t pressurePa;\n if(ATMO_MPL3115_GetPressure(&pressurePa) != ATMO_MPL3115_Status_Success)\n {\n ATMO_CreateValueVoid(out);\n return ATMO_Status_Fail;\n }\n ATMO_CreateValueInt(out, (int)pressurePa);\n return ATMO_Status_Success;",
"readPressureKpa": " uint32_t pressurePa;\n if(ATMO_MPL3115_GetPressure(&pressurePa) != ATMO_MPL3115_Status_Success)\n {\n ATMO_CreateValueVoid(out);\n return ATMO_Status_Fail;\n }\n ATMO_CreateValueInt(out, (int)(pressurePa/1000));\n return ATMO_Status_Success;"
},
"variables": {},
"embeddedPropertyConversions": {},
"codeUserChanged": {
"setup": false,
"setEnabled": false,
"setDisabled": false,
"setEnabledDisabled": false,
"readAltitude": false,
"readPressure": false,
"readPressureKpa": false
},
"i2cInstance": 1,
"i2cAddress": "0x60",
"pressureOffset": "0",
"altitudeOffset": "0",
"tempOffset": "0"
},
"meta": {
"editorX": 1156,
"editorY": 0,
"lastTrigger": "pressureRead"
},
"triggers": {
"triggered": [],
"altitudeRead": [],
"pressureRead": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "ConvertPressure",
"targetAbility": "trigger"
}
],
"pressureReadKpa": []
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"setEnabled": false,
"setDisabled": false,
"setEnabledDisabled": false,
"readAltitude": false,
"readPressure": false,
"readPressureKpa": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "setEnabled",
"triggers": []
},
{
"name": "setDisabled",
"triggers": []
},
{
"name": "setEnabledDisabled",
"triggers": []
},
{
"name": "readAltitude",
"triggers": [
"altitudeRead"
]
},
{
"name": "readPressure",
"triggers": [
"pressureRead"
]
},
{
"name": "readPressureKpa",
"triggers": [
"pressureReadKpa"
]
}
]
},
{
"name": "AmbientLight",
"type": "EmbeddedTSL2572",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\tATMO_TSL2572_Config_t config;\n\tconfig.address = ATMO_PROPERTY(AmbientLight, i2cAddress);\n\tconfig.i2cDriverInstance = ATMO_PROPERTY(AmbientLight, i2cInstance);\n\n\treturn ( ATMO_TSL2572_Init(&config) == ATMO_TSL2572_Status_Success ) ? ATMO_Status_Success : ATMO_Status_Fail;\n",
"setEnabled": "ATMO_TSL2572_SetEnabled(true);\nreturn ATMO_Status_Success;",
"setDisabled": "ATMO_TSL2572_SetEnabled(false);\nreturn ATMO_Status_Success;",
"setEnabledDisabled": "bool enabled = false;\nATMO_GetBool(in, &enabled);\nATMO_TSL2572_SetEnabled(enabled);\nreturn ATMO_Status_Success;",
"readAmbientLight": " float lightLux;\n if(ATMO_TSL2572_GetAmbientLight(&lightLux) != ATMO_TSL2572_Status_Success)\n {\n ATMO_CreateValueVoid(out);\n return ATMO_Status_Fail;\n }\n ATMO_CreateValueInt(out, (int)lightLux);\n return ATMO_Status_Success;"
},
"variables": {},
"embeddedPropertyConversions": {},
"codeUserChanged": {
"setup": false,
"setEnabled": false,
"setDisabled": false,
"setEnabledDisabled": false,
"readAmbientLight": false
},
"i2cInstance": 1,
"i2cAddress": "0x39"
},
"meta": {
"editorX": 195,
"editorY": 678,
"lastTrigger": "ambientLightRead"
},
"triggers": {
"triggered": [],
"ambientLightRead": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "EmbeddedComparison",
"targetAbility": "evaluate"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "EmbeddedComparison2",
"targetAbility": "evaluate"
}
]
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"setEnabled": false,
"setDisabled": false,
"setEnabledDisabled": false,
"readAmbientLight": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "setEnabled",
"triggers": []
},
{
"name": "setDisabled",
"triggers": []
},
{
"name": "setEnabledDisabled",
"triggers": []
},
{
"name": "readAmbientLight",
"triggers": [
"ambientLightRead"
]
}
]
},
{
"name": "Weather",
"type": "EmbeddedIconLinesDisplay",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables",
"rpk"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"displayPage": "\n\tATMO_UI_Page_DisplayPageByCoord(ATMO_PROPERTY(Weather, x), ATMO_PROPERTY(Weather, y), false);\n\treturn ATMO_Status_Success;\n\t",
"onDisplayed": "\n\treturn ATMO_Status_Success;\n ",
"onLeave": "\n\treturn ATMO_Status_Success;\n\t",
"setIconLabelAndColor": "\n struct {\n char str[32];\n GUI_COLOR color;\n } icon_data;\n \n ATMO_GetBinary(in, &icon_data, sizeof(icon_data));\n ATMO_UI_ICONLINES_SetIconLabelColor(ATMO_VARIABLE(Weather, pageHandle), icon_data.str, icon_data.color);\n return ATMO_Status_Success;\n ",
"setIconLabel": "\n char str[32];\n ATMO_GetString(in, str, 32);\n ATMO_UI_ICONLINES_SetIconLabel(ATMO_VARIABLE(Weather, pageHandle), str);\n return ATMO_Status_Success;\n ",
"setup": "\n ATMO_UI_PAGE_Config_t config;\n config.hidden = ATMO_PROPERTY(Weather, pageHidden);\n config.textColor = ATMO_PROPERTY(Weather, textColor);\n config.activeButtons = ATMO_UI_Page_GetButtonMask(ATMO_PROPERTY(Weather, topRightButtonEnabled),\n ATMO_PROPERTY(Weather,bottomRightButtonEnabled), ATMO_PROPERTY(Weather, topLeftButtonEnabled), ATMO_PROPERTY(Weather, bottomLeftButtonEnabled));\n\tconfig.x = ATMO_PROPERTY(Weather, x);\n config.y = ATMO_PROPERTY(Weather, y);\n\tstrncpy(config.topLeftButtonLabel, ATMO_PROPERTY(Weather, topLeftButtonLabel), ATMO_BUTTON_LABEL_MAXLEN);\n\tstrncpy(config.topRightButtonLabel, ATMO_PROPERTY(Weather, topRightButtonLabel), ATMO_BUTTON_LABEL_MAXLEN);\n\tstrncpy(config.bottomLeftButtonLabel, ATMO_PROPERTY(Weather, bottomLeftButtonLabel), ATMO_BUTTON_LABEL_MAXLEN);\n\tstrncpy(config.bottomRightButtonLabel, ATMO_PROPERTY(Weather, bottomRightButtonLabel), ATMO_BUTTON_LABEL_MAXLEN);\n config.spanX = ATMO_PROPERTY(Weather, spanX);\n\tconfig.spanY = ATMO_PROPERTY(Weather, spanY);\n config.title = ATMO_PROPERTY(Weather, pageTitle);\n config.titleHidden = ATMO_PROPERTY(Weather, titleHidden);\n\tATMO_UI_ICONLINES_Init(&config, ATMO_PROPERTY(Weather, numLines), false);\n\tATMO_VARIABLE(Weather, pageHandle) = config.templateInstance;\n ATMO_UI_ICONLINES_SetMainText(config.templateInstance, 0, ATMO_PROPERTY(Weather, line1Text));\n ATMO_UI_ICONLINES_SetMainText(config.templateInstance, 1, ATMO_PROPERTY(Weather, line2Text));\n ATMO_UI_ICONLINES_SetMainText(config.templateInstance, 2, ATMO_PROPERTY(Weather, line3Text));\n ATMO_UI_ICONLINES_SetMainText(config.templateInstance, 3, ATMO_PROPERTY(Weather, line4Text));\n ATMO_UI_ICONLINES_SetIconLabel(config.templateInstance, ATMO_PROPERTY(Weather, iconLabel));\n ATMO_UI_ICONLINES_RegisterButtonAbilityHandle(ATMO_VARIABLE(Weather,pageHandle), 1, ATMO_ABILITY(Weather, topRightButtonPressed));\n\tATMO_UI_ICONLINES_RegisterButtonAbilityHandle(ATMO_VARIABLE(Weather,pageHandle), 2, ATMO_ABILITY(Weather, bottomRightButtonPressed));\n\tATMO_UI_ICONLINES_RegisterButtonAbilityHandle(ATMO_VARIABLE(Weather,pageHandle), 3, ATMO_ABILITY(Weather, topLeftButtonPressed));\n ATMO_UI_ICONLINES_RegisterButtonAbilityHandle(ATMO_VARIABLE(Weather,pageHandle), 4, ATMO_ABILITY(Weather, bottomLeftButtonPressed));\n ATMO_UI_ICONLINES_SetIcon(config.templateInstance, ATMO_PROPERTY(Weather, icon));\n ATMO_UI_ICONLINES_RegisterOnDisplayedAbilityHandle(ATMO_VARIABLE(Weather,pageHandle), ATMO_ABILITY(Weather, onDisplayed));\n ATMO_UI_ICONLINES_RegisterOnLeaveAbilityHandle(config.templateInstance, ATMO_ABILITY(Weather, onLeave));\n return ATMO_Status_Success;\n ",
"setLine1Text": "\n char label[32];\n if(ATMO_GetString(in, label, 32) == ATMO_Status_Success)\n {\n ATMO_UI_ICONLINES_SetMainText(ATMO_VARIABLE(Weather,pageHandle), 0, label);\n }\n else\n {\n return ATMO_Status_Fail;\n }\n\n return ATMO_Status_Success;\n ",
"setLine2Text": "\n char label[32];\n if(ATMO_GetString(in, label, 32) == ATMO_Status_Success)\n {\n ATMO_UI_ICONLINES_SetMainText(ATMO_VARIABLE(Weather,pageHandle), 1, label);\n }\n else\n {\n return ATMO_Status_Fail;\n }\n\n return ATMO_Status_Success;\n ",
"setLine3Text": "\n char label[32];\n if(ATMO_GetString(in, label, 32) == ATMO_Status_Success)\n {\n ATMO_UI_ICONLINES_SetMainText(ATMO_VARIABLE(Weather,pageHandle), 2, label);\n }\n else\n {\n return ATMO_Status_Fail;\n }\n\n return ATMO_Status_Success;\n ",
"setLine4Text": "\n char label[32];\n if(ATMO_GetString(in, label, 32) == ATMO_Status_Success)\n {\n ATMO_UI_ICONLINES_SetMainText(ATMO_VARIABLE(Weather,pageHandle), 3, label);\n }\n else\n {\n return ATMO_Status_Fail;\n }\n\n return ATMO_Status_Success;\n ",
"topRightButtonPressed": "\n\treturn ATMO_Status_Success;\n\t",
"bottomRightButtonPressed": "\n\treturn ATMO_Status_Success;\n\t",
"topLeftButtonPressed": "\n\treturn ATMO_Status_Success;\n\t",
"bottomLeftButtonPressed": "\n\treturn ATMO_Status_Success;\n\t"
},
"variables": {
"pageHandle": {
"type": "ATMO_DriverInstanceHandle_t"
}
},
"embeddedPropertyConversions": {
"pageTitle": "string",
"topRightButtonLabel": "string",
"bottomRightButtonLabel": "string",
"topLeftButtonLabel": "string",
"bottomLeftButtonLabel": "string",
"iconLabel": "string",
"line1Text": "string",
"line2Text": "string",
"line3Text": "string",
"line4Text": "string"
},
"codeUserChanged": {
"displayPage": false,
"onDisplayed": false,
"onLeave": false,
"setIconLabelAndColor": false,
"setIconLabel": false,
"setup": false,
"setLine1Text": false,
"setLine2Text": false,
"setLine3Text": false,
"setLine4Text": false,
"topRightButtonPressed": false,
"bottomRightButtonPressed": false,
"topLeftButtonPressed": false,
"bottomLeftButtonPressed": false
},
"textColor": "GUI_BLUE",
"pageTitle": "Weather",
"titleHidden": false,
"pageHidden": false,
"topRightButtonLabel": "",
"topRightButtonEnabled": false,
"bottomRightButtonLabel": "",
"bottomRightButtonEnabled": false,
"topLeftButtonLabel": "",
"topLeftButtonEnabled": false,
"bottomLeftButtonLabel": "",
"bottomLeftButtonEnabled": false,
"x": "1",
"y": 0,
"spanX": "1",
"spanY": "1",
"icon": "icon_applications_thermostat",
"iconLabel": "",
"numLines": 4,
"line1Text": "TEMP",
"line2Text": "0",
"line3Text": "HUM",
"line4Text": "0"
},
"meta": {
"editorX": 424,
"editorY": 0,
"lastTrigger": "onDisplayed"
},
"triggers": {
"triggered": [],
"onDisplayed": [],
"onLeave": [],
"topRightButtonPressed": [],
"bottomRightButtonPressed": [],
"topLeftButtonPressed": [],
"bottomLeftButtonPressed": []
},
"interruptAbilities": {
"trigger": false,
"displayPage": false,
"onDisplayed": false,
"onLeave": false,
"setIconLabelAndColor": false,
"setIconLabel": false,
"setup": false,
"setLine1Text": false,
"setLine2Text": false,
"setLine3Text": false,
"setLine4Text": false,
"topRightButtonPressed": false,
"bottomRightButtonPressed": false,
"topLeftButtonPressed": false,
"bottomLeftButtonPressed": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "displayPage",
"triggers": []
},
{
"name": "onDisplayed",
"triggers": [
"onDisplayed"
]
},
{
"name": "onLeave",
"triggers": [
"onLeave"
]
},
{
"name": "setIconLabelAndColor",
"triggers": []
},
{
"name": "setIconLabel",
"triggers": []
},
{
"name": "setup",
"triggers": []
},
{
"name": "setLine1Text",
"triggers": []
},
{
"name": "setLine2Text",
"triggers": []
},
{
"name": "setLine3Text",
"triggers": []
},
{
"name": "setLine4Text",
"triggers": []
},
{
"name": "topRightButtonPressed",
"triggers": [
"topRightButtonPressed"
]
},
{
"name": "bottomRightButtonPressed",
"triggers": [
"bottomRightButtonPressed"
]
},
{
"name": "topLeftButtonPressed",
"triggers": [
"topLeftButtonPressed"
]
},
{
"name": "bottomLeftButtonPressed",
"triggers": [
"bottomLeftButtonPressed"
]
}
]
},
{
"name": "Temperature",
"type": "EmbeddedENS210",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\tATMO_ENS210_Config_t config;\n\tconfig.address = ATMO_PROPERTY(Temperature, i2cAddress);\n\tconfig.i2cDriverInstance = ATMO_PROPERTY(Temperature, i2cInstance);\n\tconfig.tempCalibrationOffset = ATMO_PROPERTY(Temperature, tempCalibrationOffset);\n\n\treturn ( ATMO_ENS210_Init(&config) == ATMO_ENS210_Status_Success ) ? ATMO_Status_Success : ATMO_Status_Fail;\n",
"setEnabled": "ATMO_ENS210_SetEnabled(true);\nreturn ATMO_Status_Success;",
"setDisabled": "ATMO_ENS210_SetEnabled(false);\nreturn ATMO_Status_Success;",
"setEnabledDisabled": "bool enabled = false;\nATMO_GetBool(in, &enabled);\nATMO_ENS210_SetEnabled(enabled);\nreturn ATMO_Status_Success;",
"readTemperature": " float tempC;\n \n if(ATMO_ENS210_GetTemperatureFloat(&tempC) == ATMO_ENS210_Status_Success)\n {\n ATMO_CreateValueFloat(out, tempC);\n }\n else\n {\n ATMO_CreateValueVoid(out);\n }\n \n return ATMO_Status_Success;",
"readHumidity": " float humidityPct;\n\n if(ATMO_ENS210_GetHumidityFloat(&humidityPct) == ATMO_ENS210_Status_Success)\n {\n ATMO_CreateValueFloat(out, humidityPct);\n }\n else\n {\n ATMO_CreateValueVoid(out);\n }\n \n return ATMO_Status_Success;"
},
"variables": {},
"embeddedPropertyConversions": {},
"codeUserChanged": {
"setup": false,
"setEnabled": false,
"setDisabled": false,
"setEnabledDisabled": false,
"readTemperature": false,
"readHumidity": false
},
"i2cInstance": 1,
"i2cAddress": "0x43",
"tempCalibrationOffset": -7
},
"meta": {
"editorX": 195,
"editorY": 0,
"lastTrigger": "temperatureRead"
},
"triggers": {
"triggered": [],
"temperatureRead": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "TEMP",
"targetAbility": "setValue"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "GetTempStr",
"targetAbility": "trigger"
}
],
"humidityRead": []
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"setEnabled": false,
"setDisabled": false,
"setEnabledDisabled": false,
"readTemperature": false,
"readHumidity": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "setEnabled",
"triggers": []
},
{
"name": "setDisabled",
"triggers": []
},
{
"name": "setEnabledDisabled",
"triggers": []
},
{
"name": "readTemperature",
"triggers": [
"temperatureRead"
]
},
{
"name": "readHumidity",
"triggers": [
"humidityRead"
]
}
]
},
{
"name": "TEMP",
"type": "EmbeddedBLECharacteristicCustom",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables",
"ble"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n\tATMO_BLE_GATTSAddService(\n\t\tATMO_PROPERTY(TEMP, instance),\n\t\t&ATMO_VARIABLE(TEMP, bleServiceHandle), \n\t\tATMO_PROPERTY(TEMP, bleServiceUuid));\n\t\n\tuint8_t property = 0;\n\tuint8_t permission = 0;\n\t\n\tproperty |= ATMO_PROPERTY(TEMP, read) ? ATMO_BLE_Property_Read : 0;\n\tproperty |= ATMO_PROPERTY(TEMP, write) ? ATMO_BLE_Property_Write : 0;\n\tproperty |= ATMO_PROPERTY(TEMP, notify) ? ATMO_BLE_Property_Notify : 0;\n\n\tpermission |= ATMO_PROPERTY(TEMP, read) ? ATMO_BLE_Permission_Read : 0;\n\tpermission |= ATMO_PROPERTY(TEMP, write) ? ATMO_BLE_Permission_Write : 0;\n\n\tATMO_DATATYPE types[3] = {ATMO_PROPERTY(TEMP, writeDataType), ATMO_PROPERTY(TEMP, readDataType), ATMO_PROPERTY(TEMP, notifyDataType)};\n\t\n\tATMO_BLE_GATTSAddCharacteristic(\n\t\tATMO_PROPERTY(TEMP, instance),\n\t\t&ATMO_VARIABLE(TEMP, bleCharacteristicHandle), \n\t\tATMO_VARIABLE(TEMP, bleServiceHandle), \n\t\tATMO_PROPERTY(TEMP, bleCharacteristicUuid), \n\t\tproperty, permission, ATMO_GetMaxValueSize(3, 64, types));\n\t\n\tATMO_BLE_GATTSRegisterCharacteristicAbilityHandle(\n\t\tATMO_PROPERTY(TEMP, instance),\n\t\tATMO_VARIABLE(TEMP, bleCharacteristicHandle), \n\t\tATMO_BLE_Characteristic_Written, \n\t\tATMO_ABILITY(TEMP, written));\n\t\n\treturn ATMO_Status_Success;\n\t",
"setValue": "\n\t\n\t// Convert to the desired write data type\n\tATMO_Value_t convertedValue;\n\tATMO_InitValue(&convertedValue);\n\tATMO_CreateValueConverted(&convertedValue, ATMO_PROPERTY(TEMP, readDataType), in);\n\n\tATMO_BLE_GATTSSetCharacteristic(\n\t\tATMO_PROPERTY(TEMP, instance),\n\t\tATMO_VARIABLE(TEMP, bleCharacteristicHandle),\n\t\tconvertedValue.size, \n\t\t(uint8_t *)convertedValue.data,\n\t\tNULL);\n\t\n\tATMO_FreeValue(&convertedValue);\n\t\t\n\treturn ATMO_Status_Success;\n\t",
"written": "\n\tATMO_CreateValueConverted(out, ATMO_PROPERTY(TEMP, writeDataType), in);\n\treturn ATMO_Status_Success;\n\t",
"subscibed": "\treturn ATMO_Status_Success;",
"unsubscribed": "\treturn ATMO_Status_Success;"
},
"variables": {
"bleServiceHandle": {
"type": "ATMO_BLE_Handle_t"
},
"bleCharacteristicHandle": {
"type": "ATMO_BLE_Handle_t"
}
},
"embeddedPropertyConversions": {
"bleServiceUuid": "string",
"bleCharacteristicUuid": "string"
},
"codeUserChanged": {
"setup": false,
"setValue": false,
"written": false,
"subscibed": false,
"unsubscribed": false
},
"instance": 0,
"bleServiceUuid": "2b8af715-a0b2-4062-ae26-a89c6d832ad8",
"bleCharacteristicUuid": "2b8af715-a0b2-4062-ae26-a89c6d832adb",
"read": true,
"write": true,
"notify": false,
"readDataType": "ATMO_DATATYPE_FLOAT",
"writeDataType": "ATMO_DATATYPE_FLOAT",
"notifyDataType": "ATMO_DATATYPE_FLOAT"
},
"meta": {
"editorX": 302,
"editorY": 87,
"lastTrigger": "written"
},
"triggers": {
"triggered": [],
"written": [],
"subscibed": [],
"unsubscribed": []
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"setValue": "valueSet",
"written": true,
"subscibed": true,
"unsubscribed": true
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "setValue",
"triggers": []
},
{
"name": "written",
"triggers": [
"written"
]
},
{
"name": "subscibed",
"triggers": [
"subscibed"
]
},
{
"name": "unsubscribed",
"triggers": [
"unsubscribed"
]
}
]
},
{
"name": "Humidity",
"type": "EmbeddedENS210",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\tATMO_ENS210_Config_t config;\n\tconfig.address = ATMO_PROPERTY(Humidity, i2cAddress);\n\tconfig.i2cDriverInstance = ATMO_PROPERTY(Humidity, i2cInstance);\n\tconfig.tempCalibrationOffset = ATMO_PROPERTY(Humidity, tempCalibrationOffset);\n\n\treturn ( ATMO_ENS210_Init(&config) == ATMO_ENS210_Status_Success ) ? ATMO_Status_Success : ATMO_Status_Fail;\n",
"setEnabled": "ATMO_ENS210_SetEnabled(true);\nreturn ATMO_Status_Success;",
"setDisabled": "ATMO_ENS210_SetEnabled(false);\nreturn ATMO_Status_Success;",
"setEnabledDisabled": "bool enabled = false;\nATMO_GetBool(in, &enabled);\nATMO_ENS210_SetEnabled(enabled);\nreturn ATMO_Status_Success;",
"readTemperature": " float tempC;\n \n if(ATMO_ENS210_GetTemperatureFloat(&tempC) == ATMO_ENS210_Status_Success)\n {\n ATMO_CreateValueFloat(out, tempC);\n }\n else\n {\n ATMO_CreateValueVoid(out);\n }\n \n return ATMO_Status_Success;",
"readHumidity": " float humidityPct;\n\n if(ATMO_ENS210_GetHumidityFloat(&humidityPct) == ATMO_ENS210_Status_Success)\n {\n ATMO_CreateValueFloat(out, humidityPct);\n }\n else\n {\n ATMO_CreateValueVoid(out);\n }\n \n return ATMO_Status_Success;"
},
"variables": {},
"embeddedPropertyConversions": {},
"codeUserChanged": {
"setup": false,
"setEnabled": false,
"setDisabled": false,
"setEnabledDisabled": false,
"readTemperature": false,
"readHumidity": false
},
"i2cInstance": 1,
"i2cAddress": "0x43",
"tempCalibrationOffset": -7
},
"meta": {
"editorX": 205,
"editorY": 245,
"lastTrigger": "humidityRead"
},
"triggers": {
"triggered": [],
"temperatureRead": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "GetHumidityStr",
"targetAbility": "trigger"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "HUMID",
"targetAbility": "setValue"
}
],
"humidityRead": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "GetHumidityStr",
"targetAbility": "trigger"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "HUMID",
"targetAbility": "setValue"
}
]
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"setEnabled": false,
"setDisabled": false,
"setEnabledDisabled": false,
"readTemperature": false,
"readHumidity": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "setEnabled",
"triggers": []
},
{
"name": "setDisabled",
"triggers": []
},
{
"name": "setEnabledDisabled",
"triggers": []
},
{
"name": "readTemperature",
"triggers": [
"temperatureRead"
]
},
{
"name": "readHumidity",
"triggers": [
"humidityRead"
]
}
]
},
{
"name": "AirQuality",
"type": "EmbeddedCCS811",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\tATMO_CCS811_Config_t config;\n\tconfig.operatingMode = ATMO_PROPERTY(AirQuality, operatingMode);\n\tconfig.address = ATMO_PROPERTY(AirQuality, i2cAddress);\n\tconfig.i2cDriverInstance = ATMO_PROPERTY(AirQuality, i2cInstance);\n\n\treturn ( ATMO_CCS811_Init(&config) == ATMO_CCS811_Status_Success ) ? ATMO_Status_Success : ATMO_Status_Fail;\n",
"setEnabled": "ATMO_CCS811_SetEnabled(true);\nreturn ATMO_Status_Success;",
"setDisabled": "ATMO_CCS811_SetEnabled(false);\nreturn ATMO_Status_Success;",
"setEnabledDisabled": "bool enabled = false;\nATMO_GetBool(in, &enabled);\nATMO_CCS811_SetEnabled(enabled);\nreturn ATMO_Status_Success;",
"readTVOC": " uint16_t tvoc;\n\n if(ATMO_CCS811_GetTVOC(&tvoc) == ATMO_CCS811_Status_Success)\n {\n ATMO_CreateValueUnsignedInt(out, (unsigned int)tvoc);\n }\n else\n {\n ATMO_CreateValueVoid(out);\n }\n \n return ATMO_Status_Success;",
"readCO2": " uint16_t co2;\n \n if(ATMO_CCS811_GetCO2(&co2) == ATMO_CCS811_Status_Success)\n {\n ATMO_CreateValueInt(out, (int)co2);\n }\n else\n {\n ATMO_CreateValueVoid(out);\n }\n \n return ATMO_Status_Success;"
},
"variables": {},
"embeddedPropertyConversions": {},
"codeUserChanged": {
"setup": false,
"setEnabled": false,
"setDisabled": false,
"setEnabledDisabled": false,
"readTVOC": false,
"readCO2": false
},
"i2cInstance": 1,
"i2cAddress": "0x5A",
"operatingMode": "1"
},
"meta": {
"editorX": 196,
"editorY": 493,
"lastTrigger": "TVOCRead"
},
"triggers": {
"triggered": [],
"TVOCRead": [
{
"mapping": {},
"targetOrder": [],
"targetElement": "QUAL",
"targetAbility": "setValue"
},
{
"mapping": {},
"targetOrder": [],
"targetElement": "GetAirQualityStr",
"targetAbility": "trigger"
}
],
"CO2Read": []
},
"interruptAbilities": {
"trigger": false,
"setup": false,
"setEnabled": false,
"setDisabled": false,
"setEnabledDisabled": false,
"readTVOC": false,
"readCO2": false
},
"abilities": [
{
"name": "trigger",
"triggers": [
"triggered"
]
},
{
"name": "setup",
"triggers": []
},
{
"name": "setEnabled",
"triggers": []
},
{
"name": "setDisabled",
"triggers": []
},
{
"name": "setEnabledDisabled",
"triggers": []
},
{
"name": "readTVOC",
"triggers": [
"TVOCRead"
]
},
{
"name": "readCO2",
"triggers": [
"CO2Read"
]
}
]
},
{
"name": "QUAL",
"type": "EmbeddedBLECharacteristicCustom",
"variants": [
"embedded",
"triggers",
"abilities",
"properties",
"variables",
"ble"
],
"properties": {
"errorData": {},
"code": {
"trigger": "\treturn ATMO_Status_Success;",
"setup": "\n\tATMO_BLE_GATTSAddService(\n\t\tATMO_PROPERTY(QUAL, instance),\n\t\t&ATMO_VARIABLE(QUAL, bleServiceHandle), \n\t\tATMO_PROPERTY(QUAL, bleServiceUuid));\n\t\n\tuint8_t property = 0;\n\tuint8_t permission = 0;\n\t\n\tproperty |= ATMO_PROPERTY(QUAL, read) ? ATMO_BLE_Property_Read : 0;\n\tproperty |= ATMO_PROPERTY(QUAL, write) ? ATMO_BLE_Property_Write : 0;\n\tproperty |= ATMO_PROPERTY(QUAL, notify) ? ATMO_BLE_Property_Notify : 0;\n\n\tpermission |= ATMO_PROPERTY(QUAL, read) ? ATMO_BLE_Permission_Read : 0;\n\tpermission |= ATMO_PROPERTY(QUAL, write) ? ATMO_BLE_Permission_Write : 0;\n\n\tATMO_DATATYPE types[3] = {ATMO_PROPERTY(QUAL, writeDataType), ATMO_PROPERTY(QUAL, readDataType), ATMO_PROPERTY(QUAL, notifyDataType)};\n\t\n\tATMO_BLE_GATTSAddCharacteristic(\n\t\tATMO_PROPERTY(QUAL, instance),\n\t\t&ATMO_VARIABLE(QUAL, bleCharacteristicHandle), \n\t\tATMO_VARIABLE(QUAL, bleServiceHandle), \n\t\tATMO_PROPERTY(QUAL, bleCharacteristicUuid), \n\t\tproperty, permission, ATMO_GetMaxValueSize(3, 64, types));\n\t\n\tATMO_BLE_GATTSRegisterCharacteristicAbilityHandle(\n\t\tATMO_PROPERTY(QUAL, instance),\n\t\tATMO_VARIABLE(QUAL, bleCharacteristicHandle), \n\t\tATMO_BLE_Characteristic_Written, \n\t\tATMO_ABILITY(QUAL, written));\n\t\n\treturn ATMO_Status_Success;\n\t",
"setValue": "\n\t\n\t// Convert to the desired write data type\n\tATMO_Value_t convertedValue;\n\tATMO_InitValue(&convertedValue);\n\tATMO_CreateValueConverted(&convertedValue, ATMO_PROPERTY(QUAL, readDataType), in);\n\n\tATMO_BLE_GATTSSetCharacteristic(\n\t\tATMO_PROPERTY(QUAL, instance),\n\t\tATMO_VARIABLE(QUAL, bleCharacteristicHandle),\n\t\tconvertedValue.size, \n\t\t(uint8_t *)convertedValue.data,\n\t\tNULL);\n\t\n\tATMO_FreeValue(&convertedValue);\n\t\t\n\treturn ATMO_Status_Success;\n\t",
"written": "\n\tATMO_CreateValueConverted(out, ATMO_PROPERTY(QUAL, writeDataType), in);\n\treturn ATMO_Status_Success;\n\t",
"subscibed": "\treturn ATMO_Status_Success;",
"unsubscribed": "\treturn ATMO_Status_Success;"
},
"variables": {
"bleServiceHandle": {
"type": "ATMO_BLE_Handle_t"
},
"bleCharacteristicHandle": {
"type": "ATMO_BLE_Handle_t"
}
},
"embeddedPropertyConversions": {
"bleServiceUuid": "string",
"bleCharacteristicUuid": "string"
},
"codeUserChanged": {
"setup": false,
"setValue": false,
"written": false,
"subscibed": false,
"unsubscribed": false
},
"instance": 0,
"bleServiceUuid": "2b8af715-a0b2-4062-ae26-a89c6d832ad8",
"bleCharacteristicUuid": "2b8af715-a0b2-4062-ae26-a89c6d832add",
"read": true,
"write": true,
"notify": false,
"readDataType": "ATMO_DATATYPE_UNSIGNED_INT",
"writeDataType": "ATMO_DATATYPE_UNSIGNED_INT",
"notifyDataType": "ATMO_DATATYPE_UNSIGNED_INT"
},
"meta": {
"editorX": 401,
"editorY": 489,
"lastTrigger": "written"
},
"triggers": {
"triggered": [],
"written": [],
"subscibed": [],
"unsubscribed": []
},
"interruptAbilities": {
"trigger": false,
"setup": false,
...
This file has been truncated, please download it to see its full contents.
Comments