├── .github ├── CODEOWNERS ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── feature_request.md │ └── general_inquiry.md └── PULL_REQUEST_TEMPLATE.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── cloud_templates ├── .gitignore ├── README.md ├── aws_cdk │ ├── IoTAnalyticsPattern │ │ ├── .gitignore │ │ ├── README.md │ │ ├── app.py │ │ ├── cdk.json │ │ ├── io_t_analytics_pattern │ │ │ ├── __init__.py │ │ │ └── io_t_analytics_pattern_stack.py │ │ ├── requirements-dev.txt │ │ ├── requirements.txt │ │ ├── source.bat │ │ └── tests │ │ │ ├── __init__.py │ │ │ └── unit │ │ │ ├── __init__.py │ │ │ └── test_io_t_analytics_pattern_stack.py │ ├── KinesisPattern │ │ ├── .gitignore │ │ ├── README.md │ │ ├── app.py │ │ ├── cdk.json │ │ ├── kinesis_pattern │ │ │ ├── __init__.py │ │ │ └── kinesis_pattern_stack.py │ │ ├── requirements-dev.txt │ │ ├── requirements.txt │ │ ├── source.bat │ │ └── tests │ │ │ ├── __init__.py │ │ │ └── unit │ │ │ ├── __init__.py │ │ │ └── test_kinesis_pattern_stack.py │ ├── OpenSearchPattern │ │ ├── .gitignore │ │ ├── README.md │ │ ├── app.py │ │ ├── cdk.json │ │ ├── open_search_pattern │ │ │ ├── __init__.py │ │ │ └── open_search_pattern_stack.py │ │ ├── requirements-dev.txt │ │ ├── requirements.txt │ │ ├── source.bat │ │ └── tests │ │ │ ├── __init__.py │ │ │ └── unit │ │ │ ├── __init__.py │ │ │ └── test_open_search_pattern_stack.py │ ├── TimestreamPattern │ │ ├── .gitignore │ │ ├── README.md │ │ ├── app.py │ │ ├── cdk.json │ │ ├── requirements-dev.txt │ │ ├── requirements.txt │ │ ├── source.bat │ │ ├── tests │ │ │ ├── __init__.py │ │ │ └── unit │ │ │ │ ├── __init__.py │ │ │ │ └── test_timestream_pattern_stack.py │ │ └── timestream_pattern │ │ │ ├── __init__.py │ │ │ └── timestream_pattern_stack.py │ └── common │ │ ├── __init__.py │ │ ├── customExceptions.py │ │ └── inputValidation.py ├── demo │ ├── demo_templates │ │ ├── iotanalytics_pattern.json │ │ ├── kinesis_pattern.json │ │ ├── opensearch_pattern.json │ │ └── timestream_pattern.json │ └── demo_weather_station_code │ │ ├── README.md │ │ └── main.cpp └── user_guides │ ├── images │ ├── iotanalytics_structure.png │ ├── kinesis_structure.png │ ├── opensearch_structure.png │ └── timestream_structure.png │ ├── iotanalytics_guide.md │ ├── kinesis_guide.md │ ├── opensearch_guide.md │ └── timestream_guide.md ├── examples ├── Arduino │ ├── README.md │ ├── SerialPassthrough │ │ ├── README.md │ │ └── SerialPassthrough.ino │ ├── WeatherStation │ │ └── WeatherUno.ino │ ├── expressLink_temperature │ │ ├── README.md │ │ └── expressLink_temperature.ino │ └── grafana_demo │ │ ├── expresslink.h │ │ ├── expresslink.ino │ │ └── grafana_demo.ino ├── __pycache__ │ └── weather_station.cpython-39.pyc └── python │ └── sara_example │ ├── __pycache__ │ ├── expresslink.cpython-39.pyc │ └── weather_station.cpython-39.pyc │ ├── code.py │ ├── expresslink.py │ ├── readme.md │ ├── station_test.py │ └── weather_station.py ├── hardware-designs └── DemoBadge │ ├── .gitignore │ ├── README.md │ ├── aws-iot-expresslink-demo-badge.kicad_pcb │ ├── aws-iot-expresslink-demo-badge.kicad_pro │ ├── aws-iot-expresslink-demo-badge.kicad_sch │ ├── components │ ├── ALS-PT19-315C_L177_TR8 │ │ ├── ALS-PT19-315C_L177_TR8.kicad_sym │ │ ├── ALS-PT19-315C_L177_TR8.step │ │ └── XDCR_ALS-PT19-315C_L177_TR8.kicad_mod │ ├── ER-TFT013-2 │ │ ├── ER-TFT013-2.kicad_sym │ │ └── ER-TFT013-2.pretty │ │ │ ├── 1.3 TFT IPS - Flush Reverse Mount.stp │ │ │ └── ER-TFT013-2.kicad_mod │ ├── IN-S32GTLS │ │ ├── IN-S32GTLS.kicad_sym │ │ └── IN-S32GTLS.pretty │ │ │ └── IN-S32GTLS.kicad_mod │ ├── JS2020 │ │ ├── JS2020.kicad_sym │ │ └── JS2020.pretty │ │ │ ├── JS202011SCQN.STEP │ │ │ └── JS202011SCQN.kicad_mod │ ├── NT3H2211W0FHKH │ │ ├── NT3H2211W0FHKH.kicad_sym │ │ └── NT3H2211W0FHKH.pretty │ │ │ ├── IC_NT3H2211W0FHKH.kicad_mod │ │ │ └── NT3H2211W0FHKH.step │ ├── PTS815 │ │ ├── PTS815.kicad_sym │ │ ├── PTS815.pretty │ │ │ └── PTS815 SJM 250 SMTR LFS.kicad_mod │ │ └── PTS815SJM250.stp │ ├── RP-Pico Libraries │ │ ├── MCU_RaspberryPi_and_Boards.kicad_sym │ │ ├── MCU_RaspberryPi_and_Boards.pretty │ │ │ ├── Crystal_SMD_HC49-US.kicad_mod │ │ │ ├── RP2040-QFN-56.kicad_mod │ │ │ └── RPi_Pico_SMD_TH.kicad_mod │ │ ├── Pico.step │ │ └── Pico.wrl │ ├── SHT30-DIS.STEP │ ├── SK6812-multi.kicad_mod │ ├── SM04B-SRSS-TB.STEP │ ├── Waveshare-RP2040-Plus.kicad_mod │ ├── Waveshare-RP2040-Plus │ │ ├── PTS815 │ │ │ ├── PTS815.kicad_sym │ │ │ ├── PTS815.pretty │ │ │ │ └── PTS815 SJM 250 SMTR LFS.kicad_mod │ │ │ └── PTS815SJM250.stp │ │ ├── Waveshare-RP2040-Plus.kicad_pcb │ │ ├── Waveshare-RP2040-Plus.kicad_pro │ │ └── Waveshare-RP2040-Plus.kicad_sch │ ├── espressif-kicad-libraries │ │ ├── .gitignore │ │ ├── 3d │ │ │ ├── ESP32-C3-MINI-1.STEP │ │ │ └── ESP32-C3-MINI-1.wrl │ │ ├── LICENSE.md │ │ ├── README.md │ │ ├── footprints │ │ │ └── Espressif.pretty │ │ │ │ ├── ESP32-C3-MINI-1.kicad_mod │ │ │ │ └── ESP32-C3-MINI-1_Hand-Soldering.kicad_mod │ │ └── libraries │ │ │ └── Espressif.kicad_sym │ └── lanyard-cutout.kicad_mod │ ├── demo-badge.png │ ├── fp-lib-table │ ├── kibot.yaml │ ├── snapshot │ ├── Manufacturers │ │ ├── JLCPCB │ │ │ ├── aws-iot-expresslink-demo-badge--NPTH_map.gbr │ │ │ ├── aws-iot-expresslink-demo-badge--PTH_map.gbr │ │ │ ├── aws-iot-expresslink-demo-badge-B_Cu.gbl │ │ │ ├── aws-iot-expresslink-demo-badge-B_Mask.gbs │ │ │ ├── aws-iot-expresslink-demo-badge-B_Paste.gbp │ │ │ ├── aws-iot-expresslink-demo-badge-B_Silkscreen.gbo │ │ │ ├── aws-iot-expresslink-demo-badge-Edge_Cuts.gm1 │ │ │ ├── aws-iot-expresslink-demo-badge-F_Cu.gtl │ │ │ ├── aws-iot-expresslink-demo-badge-F_Mask.gts │ │ │ ├── aws-iot-expresslink-demo-badge-F_Paste.gtp │ │ │ ├── aws-iot-expresslink-demo-badge-F_Silkscreen.gto │ │ │ ├── aws-iot-expresslink-demo-badge-NPTH.drl │ │ │ ├── aws-iot-expresslink-demo-badge-PTH.drl │ │ │ ├── aws-iot-expresslink-demo-badge_bom_jlc.csv │ │ │ └── aws-iot-expresslink-demo-badge_cpl_jlc.csv │ │ └── aws-iot-expresslink-demo-badge-JLCPCB.zip │ └── Schematic │ │ └── aws-iot-expresslink-demo-badge-schematic.pdf │ └── sym-lib-table └── libraries ├── C └── README.md ├── arduino └── README.md └── python └── README.md /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @aws/freertos-pr-bar-raisers 2 | -------------------------------------------------------------------------------- /.github/CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | ## Code of Conduct 2 | This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). 3 | For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact 4 | opensource-codeofconduct@amazon.com with any additional questions or comments. -------------------------------------------------------------------------------- /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing Guidelines 2 | 3 | Thank you for your interest in contributing to our project. Whether it's a bug report, new feature, correction, or additional 4 | documentation, we greatly value feedback and contributions from our community. 5 | 6 | Please read through this document before submitting any issues or pull requests to ensure we have all the necessary 7 | information to effectively respond to your bug report or contribution. 8 | 9 | 10 | ## Reporting Bugs/Feature Requests 11 | 12 | We welcome you to use the GitHub issue tracker to report bugs or suggest features. 13 | 14 | When filing an issue, please check existing open, or recently closed, issues to make sure somebody else hasn't already 15 | reported the issue. Please try to include as much information as you can. Details like these are incredibly useful: 16 | 17 | * A reproducible test case or series of steps 18 | * The version of our code being used 19 | * Any modifications you've made relevant to the bug 20 | * Anything unusual about your environment or deployment 21 | 22 | 23 | ## Contributing via Pull Requests 24 | Contributions via pull requests are much appreciated. Before sending us a pull request, please ensure that: 25 | 26 | 1. You are working against the latest source on the *master* branch. 27 | 2. You check existing open, and recently merged, pull requests to make sure someone else hasn't addressed the problem already. 28 | 3. You open an issue to discuss any significant work - we would hate for your time to be wasted. 29 | 30 | To send us a pull request, please: 31 | 32 | 1. Ensure you are considering a change to AWS source code (FreeRTOS kernel, AWS libraries). Proposed changes to 3rd party code should be submitted instead to the 3rd party. 33 | 2. Fork the repository. 34 | 3. Modify the source; please focus on the specific change you are contributing. If you also reformat all the code, it will be hard for us to focus on your change. 35 | 4. Ensure local tests pass. 36 | 5. Commit to your fork using clear commit messages. 37 | 6. Send us a pull request, answering any default questions in the pull request interface. 38 | 7. Pay attention to any automated CI failures reported in the pull request, and stay involved in the conversation. 39 | 40 | GitHub provides additional document on [forking a repository](https://help.github.com/articles/fork-a-repo/) and 41 | [creating a pull request](https://help.github.com/articles/creating-a-pull-request/). 42 | 43 | ## Getting Your Pull Request Merged 44 | All Pull Requests must be approved by our review team before it can be merged in. We appreciate your patience while pull requests are reviewed as the time taken will depend on its complexity and wider implications. 45 | 46 | 47 | ## Finding contributions to work on 48 | Looking at the existing issues is a great way to find something to contribute on. As our projects, by default, use the default GitHub issue labels (enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any 'help wanted' issues is a great place to start. 49 | 50 | 51 | ## Code of Conduct 52 | This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). 53 | For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact 54 | opensource-codeofconduct@amazon.com with any additional questions or comments. 55 | 56 | 57 | ## Security issue notifications 58 | If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public github issue. 59 | 60 | 61 | ## Licensing 62 | 63 | See the LICENSE file for our project's licensing. We will ask you to confirm the licensing of your contribution. 64 | 65 | We may ask you to sign a [Contributor License Agreement (CLA)](http://en.wikipedia.org/wiki/Contributor_License_Agreement) for larger changes. 66 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug Report 3 | about: Create a report to help us improve amazon-freertos by identifying any confirmed 4 | bugs. To discuss a potential bug, or pose other inquiries, please open an issue 5 | using the template linked below. 6 | title: "[BUG] " 7 | labels: 'Type: Bug' 8 | assignees: '' 9 | 10 | --- 11 | 12 | **Describe the bug** 13 | Please provide a clear and concise description explaining the bug. 14 | 15 | **System information** 16 | - Hardware board: [ ... ] 17 | - IDE used: [ ... ] 18 | - Operating System: [ Windows | Linux | MacOS ] 19 | - Code version: (run ``git describe --tags`` to find it) 20 | - Project/Demo: [ mqtt_demo_mutual_auth | shadow_demo | custom application | etc... ] 21 | - If your project is a custom application, please add the relevant code snippet(s) in the section titled `"Code to reproduce bug"`. 22 | 23 | **Expected behavior** 24 | A clear description of the expected behavior. 25 | 26 | **Screenshots or console output** 27 | If appropriate, please paste the console output/error log explaining the issue. If possible, include the call stack. 28 | 29 | **Steps to reproduce bug** 30 | Example: 31 | 1. "I am using project [ ... ], and have configured with [ ... ]" 32 | 2. "When run on [ ... ], I observed that [ ... ]" 33 | 34 | **Code to reproduce bug** 35 | The code should be wrapped in the ``cpp`` tag in order to be displayed clearly. For example: 36 | 37 | ```cpp 38 | printf("Hello World") 39 | ``` 40 | **Additional context** 41 | Include any additional context relevant to the issue here. 42 | 43 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature Request 3 | about: Suggest a new feature for this repository. 4 | title: "[Feature Request] " 5 | labels: Feature Request 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to an issue you've encountered? If so, please elaborate.** 11 | Please provide a clear and concise description of the problem. For example, "I'm always frustrated when [ ... ]". 12 | 13 | **Describe the new feature request** 14 | Provide a clear and concise description of the feature you are proposing, as well as applicable use cases. 15 | 16 | **Describe other alternatives you've considered** 17 | Provide a clear and concise description of any alternatives you've considered. 18 | 19 | **Additional context** 20 | Add any additional information supporting the request here (screenshots, logs, references, etc.). 21 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/general_inquiry.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: General Inquiry 3 | about: Generic issue for initiating discussion on any amazon-freertos topic (ex. questions, 4 | clarifications, concerns, etc.). 5 | title: "[General] " 6 | labels: 'Type: Question' 7 | assignees: '' 8 | 9 | --- 10 | 11 | **Briefly summarize the issue being raised** 12 | Please describe the topic requiring attention in this issue, as well some background on its current status. 13 | 14 | **Describe the desired outcome** 15 | Identify the intended result of further discussion and eventual resolution of this issue. 16 | 17 | **System information** 18 | - Hardware board: [ ... ] 19 | - IDE used: [ ... ] 20 | - Operating System: [ Windows | Linux | MacOS ] 21 | - Code version: (run ``git describe --tags`` to find it) 22 | - Project/Demo: [ mqtt_demo_mutual_auth | shadow_demo | custom application | etc... ] 23 | - If your project is a custom application, please add the relevant code snippet(s) in the section titled `"Code/Steps to reproduce the current status"`. 24 | 25 | **References** 26 | Provide any screenshots, logs, etc. that may assist in providing a better understanding of the highlighted issue. 27 | 28 | **Code/Steps to reproduce the current status** 29 | If applicable, provide concrete instructions or the relevant code snippet(s) for reproducing the current status. Code should be wrapped in the ``cpp`` tag in order to be displayed clearly. For example: 30 | ```cpp 31 | printf("Hello World") 32 | ``` 33 | **Additional context** 34 | Add any remaining information not mentioned in the previous responses. 35 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | Description 4 | ----------- 5 | 6 | 7 | Checklist: 8 | ---------- 9 | 10 | 11 | - [ ] I have tested my changes. No regression in existing tests. 12 | - [ ] My code is Linted. 13 | 14 | 15 | By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice. -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | ## Code of Conduct 2 | This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). 3 | For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact 4 | opensource-codeofconduct@amazon.com with any additional questions or comments. 5 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing Guidelines 2 | 3 | Thank you for your interest in contributing to our project. Whether it's a bug report, new feature, correction, or additional 4 | documentation, we greatly value feedback and contributions from our community. 5 | 6 | Please read through this document before submitting any issues or pull requests to ensure we have all the necessary 7 | information to effectively respond to your bug report or contribution. 8 | 9 | 10 | ## Reporting Bugs/Feature Requests 11 | 12 | We welcome you to use the GitHub issue tracker to report bugs or suggest features. 13 | 14 | When filing an issue, please check existing open, or recently closed, issues to make sure somebody else hasn't already 15 | reported the issue. Please try to include as much information as you can. Details like these are incredibly useful: 16 | 17 | * A reproducible test case or series of steps 18 | * The version of our code being used 19 | * Any modifications you've made relevant to the bug 20 | * Anything unusual about your environment or deployment 21 | 22 | 23 | ## Contributing via Pull Requests 24 | Contributions via pull requests are much appreciated. Before sending us a pull request, please ensure that: 25 | 26 | 1. You are working against the latest source on the *main* branch. 27 | 2. You check existing open, and recently merged, pull requests to make sure someone else hasn't addressed the problem already. 28 | 3. You open an issue to discuss any significant work - we would hate for your time to be wasted. 29 | 30 | To send us a pull request, please: 31 | 32 | 1. Fork the repository. 33 | 2. Modify the source; please focus on the specific change you are contributing. If you also reformat all the code, it will be hard for us to focus on your change. 34 | 3. Ensure local tests pass. 35 | 4. Commit to your fork using clear commit messages. 36 | 5. Send us a pull request, answering any default questions in the pull request interface. 37 | 6. Pay attention to any automated CI failures reported in the pull request, and stay involved in the conversation. 38 | 39 | GitHub provides additional document on [forking a repository](https://help.github.com/articles/fork-a-repo/) and 40 | [creating a pull request](https://help.github.com/articles/creating-a-pull-request/). 41 | 42 | 43 | ## Finding contributions to work on 44 | Looking at the existing issues is a great way to find something to contribute on. As our projects, by default, use the default GitHub issue labels (enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any 'help wanted' issues is a great place to start. 45 | 46 | 47 | ## Code of Conduct 48 | This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). 49 | For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact 50 | opensource-codeofconduct@amazon.com with any additional questions or comments. 51 | 52 | 53 | ## Security issue notifications 54 | If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public github issue. 55 | 56 | 57 | ## Licensing 58 | 59 | See the [LICENSE](LICENSE) file for our project's licensing. We will ask you to confirm the licensing of your contribution. 60 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | this software and associated documentation files (the "Software"), to deal in 5 | the Software without restriction, including without limitation the rights to 6 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 7 | the Software, and to permit persons to whom the Software is furnished to do so. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 10 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 11 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 12 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 13 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 14 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 15 | 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## AWS IoT ExpressLink 2 | 3 | Watch [this overview presentation](https://www.youtube.com/watch?v=6K9knXZpC8A) to get a better understanding of what AWS IoT ExpressLink provides. 4 | 5 | This repository contains examples for integrating an AWS IoT ExpressLink module into an application. These examples are intended to demonstrate how to perform the common operations for an IoT device. 6 | 7 | The AWS IoT ExpressLink AT command specification can be found in the [Programmer's Manual](https://docs.aws.amazon.com/iot-expresslink). 8 | 9 | Information about AWS IoT ExpressLink and partner's hardware modules can be found at AWS Partner Network's Device Catalog from the [main page](https://aws.amazon.com/iot-expresslink). Module datasheet, Getting Started Guide, and Product Information are also included in the device catalog. 10 | 11 | ## Documentation 12 | 13 | * [AWS IoT ExpressLink Programmer's Guide](https://docs.aws.amazon.com/iot-expresslink/latest/programmersguide/elpg.html) 14 | * [AWS IoT ExpressLink Getting Started Guide](https://docs.aws.amazon.com/iot-expresslink/latest/gettingstartedguide/elgsg.html) 15 | * [AWS IoT ExpressLink Onboarding-by-Claim Customer/OEM Guide](https://docs.aws.amazon.com/iot-expresslink/latest/oemonboardingguide/oemog.html) 16 | 17 | ## Prototyping SDK libraries 18 | ### C 19 | ExpressLink drivers and examples written in C on different MCU platforms: 20 | #### STM32 MCUs 21 | CMSIS pack for ExpressLink driver and examples, integrated with STM32CubeMX, the native configuration and code generation tool from STMicroelectronics. 22 | The combination enables developers to quickly and easily create applications that connect to AWS IoT Core using ExpressLink modules with various STM32 MCUs. 23 | https://github.com/stm32-hotspot/I-CUBE-ExpressLink 24 | 25 | ### Python, CircuitPython, MicroPython 26 | 27 | For Python, including CircuitPython, MicroPython, and standard Python on Linux, macOS, and Windows: 28 | https://github.com/awslabs/aws-iot-expresslink-library-python 29 | 30 | ### Arduino 31 | 32 | For Arduino and all all microcontrollers that support the Arduino platform: 33 | https://github.com/awslabs/aws-iot-expresslink-library-arduino 34 | 35 | ## Web Resources 36 | 37 | * [AWS IoT ExpressLink product page](https://aws.amazon.com/iot-expresslink/?nc=sn&loc=1) 38 | * [AWS Partner Device Catalog for qualified AWS IoT ExpressLink hardware](https://devices.amazonaws.com/search?page=1&sv=iotxplnk) 39 | 40 | ## User Guides 41 | 42 | The user guides can be found under the folder [cloud_templates/user_guides](cloud_templates/user_guides). 43 | 44 | ### Espressif 45 | 46 | [Getting Started Guide for Espressif's AWS IoT ExpressLink Evaluation Kit on GitHub](https://github.com/espressif/esp-aws-expresslink-eval) 47 | 48 | ### Realtek 49 | 50 | [Realtek's Ameba Z2 AWS IoT ExpressLink Evaluation Kit on GitHub](https://github.com/ambiot/ambz2_aws_iot_expresslink_eval) 51 | 52 | ### u-blox 53 | 54 | [u-blox' USB-NORA-W256AWS AWS IoT ExpressLink Multiradio development kit](https://www.u-blox.com/en/product/usb-nora-w2?legacy=Current#Documentation-&-resources) 55 | 56 | [u-blox' SARA-R510AWS module LTE-M AWS IoT ExpressLink module](https://www.u-blox.com/en/product/sara-r510aws-module?legacy=Current#Documentation-&-resources) 57 | 58 | ### Telit 59 | 60 | [Telit's Bravo AWS IoT ExpressLink development kit on GitHub](https://github.com/telit/bravo-aws-expresslink) 61 | 62 | ## Hands-On Workshops and Resources 63 | 64 | The **AWS IoT ExpressLink Demo Badge Workshop** is available at https://catalog.workshops.aws/aws-iot-expresslink-demo-badge/. This workshop ran as *IOT207-R* on November 28, and as *IOT207-R1* on December 2, at AWS re:Invent 2022. 65 | 66 | The *Advanced Lab Modules* of the AWS re:Invent 2022 workshop used a Python library to quickly prototype an integration with AWS IoT ExpressLink using Python. The evolution of this early library is now available in this GitHub repository: 67 | [awslabs/aws-iot-expresslink-library-python](https://github.com/awslabs/aws-iot-expresslink-library-python) 68 | 69 | ## Hardware Designs 70 | 71 | The **AWS IoT ExpressLink Demo Badge hardware design**, with full schematics and PCB layout files, is available under the [hardware designs folder](./hardware-designs/). 72 | 73 | ## Blog Posts and Application Notes 74 | 75 | * [Introducing AWS IoT ExpressLink, making it faster and easier to develop secure IoT devices](https://aws.amazon.com/blogs/iot/introducing-aws-iot-expresslink-making-it-faster-and-easier-to-develop-secure-iot-devices/) published 2021-11-30. 76 | * [AWS IoT ExpressLink is now generally available](https://aws.amazon.com/about-aws/whats-new/2022/06/aws-iot-expresslink-generally-available/) published 2022-06-22. 77 | 78 | ## Twitch series: All Things AWS IoT ExpressLink 79 | 80 | * Live stream on AWS Twitch channel - https://twitch.tv/aws 81 | * Aired Tuesdays, 8am - 9am Pacific 82 | * 15 episodes from March 15 - June 21, 2022 83 | * Hosted by Dan Gross 84 | 85 | Episode | Date | Link | Guest(s) | Partner | 86 | ---------- | ---------- | ------------------------------------------ | -------------------------------- | -------- | 87 | Episode 1 | 2022-03-15 | https://www.twitch.tv/aws/video/1486749698 | Lucio, Michael | | 88 | Episode 2 | 2022-03-22 | https://www.twitch.tv/aws/video/1486743174 | Lucio | | 89 | Episdoe 3 | 2022-03-29 | https://www.twitch.tv/aws/video/1308163094 | Lucio, Magnus, Harald | u-blox | 90 | Episode 4 | 2022-04-05 | https://www.twitch.tv/aws/video/1314933253 | Lucio, Cobus, Joe | | 91 | Episode 5 | 2022-04-12 | https://www.twitch.tv/aws/video/1499049648 | Lucio, Harald, Magnus, Leo | u-blox | 92 | Episode 6 | 2022-04-19 | https://www.twitch.tv/aws/video/1507258985 | Cobus, Richard, Michael | | 93 | Episode 7 | 2022-04-26 | https://www.twitch.tv/aws/video/1507261412 | Lucio, Anton, Amey | Espressif| 94 | Episode 8 | 2022-05-03 | https://www.twitch.tv/aws/video/1507263672 | Lucio, Joe | | 95 | Episode 9 | 2022-05-10 | https://www.twitch.tv/aws/video/1507266090 | Lucio, Amey, Dhaval | Espressif| 96 | Episode 10 | 2022-05-17 | https://www.twitch.tv/aws/video/1507267356 | Lucio, Yasser | | 97 | Episode 11 | 2022-05-24 | https://www.twitch.tv/aws/video/1532014170 | Lucio, Amit, Prejith | Infineon | 98 | Episode 12 | 2022-05-31 | https://www.twitch.tv/aws/video/1532015120 | Lucio, Joe | | 99 | Episode 13 | 2022-06-07 | https://www.twitch.tv/aws/video/1532015794 | Lucio, Amit | Infineon | 100 | Episode 14 | 2022-06-14 | https://www.twitch.tv/aws/video/1532016601 | Lucio, Mike | | 101 | Episode 15 | 2022-06-21 | https://www.twitch.tv/aws/video/1532017442 | Lucio, Steve, Magnus, Amey, Dave | All | 102 | Episode 16 | 2022-11-22 | https://www.twitch.tv/aws/video/1690204748 | Lucio, Jefferson, Elleson, Shimis| Realtek | 103 | 104 | ## YouTube Videos 105 | 106 | * [Playlist: Building a Weather Station](https://www.youtube.com/watch?v=hGBIzlp68bU&list=PLhr1KZpdzukdy_S7NpE9kkC75SXUCMYdO) 107 | * [Espressif's AWS IoT ExpressLink Solution](https://www.youtube.com/watch?v=NSGCVH0OU7w) 108 | * [u-blox AWS IoT ExpressLink](https://www.youtube.com/watch?v=4GiBnT0I0HE) 109 | * [AWS IoT ExpressLink and the u-blox NORA-W2](https://www.youtube.com/watch?v=PvyzQwVgCCw) 110 | * [Product Showcase: AWS IoT ExpressLink SARA-R5 Starter Kit](https://www.youtube.com/watch?v=nJNYUP0413c) 111 | * [AIROC™ Cloud Connectivity Manager module & AWS IoT ExpressLink](https://www.youtube.com/watch?v=LEGDyNXPYfc) 112 | * [Innovation Coffee with AWS IoT ExpressLink](https://www.youtube.com/watch?v=K0saFj-6s6c) 113 | * [Connecting AWS IoT ExpressLink to an MQTT Broker running on AWS IoT Greengrass](https://www.youtube.com/watch?v=ii59MiFVIDI) 114 | 115 | ## Security 116 | 117 | See [CONTRIBUTING](CONTRIBUTING.md#security-issue-notifications) for more information. 118 | 119 | ## License 120 | 121 | The resources in this repository are licensed under the MIT-0 License. See the LICENSE file. 122 | -------------------------------------------------------------------------------- /cloud_templates/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | aws_cdk/common/__pycache__/ 3 | -------------------------------------------------------------------------------- /cloud_templates/README.md: -------------------------------------------------------------------------------- 1 | # Data ingestion and visualization with AWS CloudFormation templates 2 | 3 | These CloudFormation templates are prepared to deploy to the cloud and visualize the data coming from your Expresslink. To learn more about AWS CloudFormation, see [**What is CloudFormation?**](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 4 | 5 | These templates are designed in four different patterns to ingest your IoT data using: 6 | 7 | 1. Amazon Timestream 8 |
9 |
alt text
10 |
11 | 12 | In this structure, first the MQTT messages are captured in IoT Core and then pushed to Amazon Timestream by using IoT Core built rule which will provide a table view of the data to the customer. To create graphical visuals based on the data you can integrate Timestream with several visualization toools such as Amazon QuickSight. To learn more about the IoT Core-Timestream rule please see [here](https://docs.aws.amazon.com/iot/latest/developerguide/timestream-rule-action.html). 13 | 14 | 2. AWS IoT Analytics 15 |
16 |
alt text
17 |
18 | 19 | In this structure, after capturing the MQTT messages, using IoT Core built in rule, data is sent to an AWS IoT Analytics channel. Then the data will be directed to the Analytics Datastore through the Analytics pipeline. To learn more about the IoT Core to IoT Analytics rule check [here](https://docs.aws.amazon.com/iot/latest/developerguide/iotanalytics-rule-action.html). IoT Analytics automates the steps required to analyze data from IoT devices. It can filter, transform, and enrich IoT data before storing it in a time-series data store for analysis. AWS IoT Analytics is available in the following [regions](https://aws.amazon.com/iot-analytics/pricing/). 20 | 21 | 3. Amazon Kinesis Data Firehose 22 | 23 |
24 |
alt text
25 |
26 | 27 | In this pattern, the captured MQTT messages in AWS IoT core will be sent to an Amazon Kinesis Data Firehose allowing you to collect, process and analyze large bandwidth of data in real time. The service enables you to author and run code against streaming sources to perform time-series analytics, feed real-time dashboards, and create real-time metrics. You can create a Delivery Stream in the Kinesis Firehose with an S3 bucket as its destination in which the data will be stored. You can then visualize the data in the bucket by building an [Athena table](https://docs.aws.amazon.com/athena/latest/ug/data-sources-glue.html) (using Glue Crawler) on top of that and [connecting Athena to Amazon Quicksight](https://docs.aws.amazon.com/quicksight/latest/user/create-a-data-set-athena.html). Detailed information about the IoT Core rule for sending data to Kinesis Data Firehose is available [here](https://docs.aws.amazon.com/iot/latest/developerguide/kinesis-firehose-rule-action.html). Amazon Kinesis Firehose is available in the following [regions](https://aws.amazon.com/kinesis/data-firehose/pricing/). 28 | 29 | 4. Amazon OpenSearch Service 30 |
31 |
alt text
32 |
33 | 34 | Amazon OpenSearch Service is a managed service that makes it easy to deploy, operate, and scale OpenSearch clusters in the AWS Cloud. It is a fully open-source search and analytics engine for use cases such as log analytics, real-time application monitoring, and clickstream analysis. To learn more you can refer to [What is Amazon OpenSearch Service?](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/) in the Amazon OpenSearch Service Developer Guide. 35 | In this pattern, the captured data in IoT Core will be pushed to Amazon OpenSearch service through built in IoT rule. You can then use tools like OpenSearch integrated dashboards to query and visualize data in OpenSearch Service. For more details refer to [OpenSearch rule action](https://docs.aws.amazon.com/iot/latest/developerguide/opensearch-rule-action.html). 36 | 37 | 38 | The subdirectories contain the following: 39 | 40 | * Under `demo` directory, there are the demo templates along with a sample program to run on your Expresslink. 41 | * Under `aws_cdk` directory, there are the CDK (Cloud Development Kit) stacks used to crate the CloudFormation templates. See [What is the AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/home.html) to learn more about AWS CDK. 42 | * Under `user_guides` directory you can find the guides to get started with the templates and how to customize them with AWS CDK. 43 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/IoTAnalyticsPattern/.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | __pycache__ 3 | .pytest_cache 4 | .venv 5 | *.egg-info 6 | 7 | # CDK asset staging directory 8 | .cdk.staging 9 | cdk.out 10 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/IoTAnalyticsPattern/README.md: -------------------------------------------------------------------------------- 1 | 2 | # Welcome to your CDK project! 3 | # IoT Data visulaization with AWS IoT Analytics 4 | 5 | The `cdk.json` file tells the CDK Toolkit how to execute your app. 6 | 7 | This project is set up like a standard Python project. The initialization 8 | process also creates a virtualenv within this project, stored under the `.venv` 9 | directory. To create the virtualenv it assumes that there is a `python3` 10 | (or `python` for Windows) executable in your path with access to the `venv` 11 | package. If for any reason the automatic creation of the virtualenv fails, 12 | you can create the virtualenv manually. 13 | 14 | To manually create a virtualenv on MacOS and Linux: 15 | 16 | ``` 17 | $ python3 -m venv .venv 18 | ``` 19 | 20 | After the init process completes and the virtualenv is created, you can use the following 21 | step to activate your virtualenv. 22 | 23 | ``` 24 | $ source .venv/bin/activate 25 | ``` 26 | 27 | If you are a Windows platform, you would activate the virtualenv like this: 28 | 29 | ``` 30 | % .venv\Scripts\activate.bat 31 | ``` 32 | 33 | Once the virtualenv is activated, you can install the required dependencies. 34 | 35 | ``` 36 | $ pip install -r requirements.txt 37 | ``` 38 | 39 | At this point you can now synthesize the CloudFormation template for this code. 40 | 41 | ``` 42 | $ cdk synth 43 | ``` 44 | 45 | To add additional dependencies, for example other CDK libraries, just add 46 | them to your `setup.py` file and rerun the `pip install -r requirements.txt` 47 | command. 48 | 49 | ## Useful commands 50 | 51 | * `cdk ls` list all stacks in the app 52 | * `cdk synth` emits the synthesized CloudFormation template 53 | * `cdk deploy` deploy this stack to your default AWS account/region 54 | * `cdk diff` compare deployed stack with current state 55 | * `cdk docs` open CDK documentation 56 | 57 | ## Context parameters 58 | There are multiple context parameters that you need to set before synthesizing or delpoying this CDK stack. You can specify a context variable either as part of an AWS CDK CLI command, or in `cdk.json`. 59 | To create a command line context variable, use the __--context (-c) option__, as shown in the following example. 60 | 61 | ``` 62 | $ cdk cdk synth -c bucket_name=mybucket 63 | ``` 64 | 65 | To specify the same context variable and value in the cdk.json file, use the following code. 66 | 67 | ``` 68 | { 69 | "context": { 70 | "bucket_name": "mybucket" 71 | } 72 | } 73 | ``` 74 | 75 | In this project, these are the following parameters to be set: 76 | 77 | * `topic_sql` 78 |
It is required for IoT Core rule creation to add a simplified SQL syntax to filter messages received on an MQTT topic and push the data elsewhere. 79 |
__Format__: Enter an SQL statement using the following: ```SELECT FROM WHERE ```. For example: ```SELECT temperature FROM 'iot/topic' WHERE temperature > 50```. To learn more, see AWS IoT SQL Reference. 80 | 81 | * `analytics_channel_name`    `` 82 |
The name of the IoT Analytics channel that will get connected to the IoT Core to get your data. 83 |
__Format__: Choose a unique name that you can easily identify. The channel name must contain 1-128 characters. Valid characters are a-z, A-Z, 0-9, and _ (underscore). 84 | 85 | * `analytics_datastore_name`    `` 86 |
The name of the IoT Analytics datastore that will get connected to the IoT Core to store your data. 87 |
__Format__: A unique ID identifies your data store. You can't change this ID after you create it. Valid characters: a-z, A-Z, 0-9, and _ (underscore). 88 | 89 | * `analytics_dataset_name`    `` 90 |
The name of the IoT Analytics SQL dataset that will get connected to the IoT Core. A SQL dataset is a materialized view from a data store. 91 |
__Format__: Choose a unique name that you can easily identify. The dataset name must contain 1-128 characters. Valid characters are a-z, A-Z, 0-9, and _ (underscore). 92 | 93 | * `analytics_pipeline_name`    `` 94 |
The name of the IoT Analytics pipeline that will read messages from the channel and write processed data to the datastore. 95 |
__Format__: Valid characters: a-z, A-Z, 0-9, and _ (underscore). 96 | 97 | * `analytics_iot_rule_name`    `` 98 |
The name of the IoT Core rule that is going to be created. 99 |
__Format__: Should be an alphanumeric string that can also contain underscore (_) characters, but no spaces. 100 | 101 | * `analytics_iot_role_name`    `` 102 |
An IAM role should be created to grant AWS IoT access to your endpoint. This parameter is for setting the name of this role. 103 |
__Format__: Enter a unique role name that contains alphanumeric characters, hyphens, and underscores. A role name can't contain any spaces. 104 | 105 | * `channel_storage_type`    `` 106 |
Where channel data is stored. You may choose one of ```serviceManagedS3``` or ```customerManagedS3``` storage. If not specified, the default is ```serviceManagedS3```. This can't be changed after creation of the channel. 107 |
__Format__: You should either include ```"channel_storage_type": "service_managed"``` or ```"channel_storage_type": "customer_managed"``` in the cdk.json file or command line. 108 | 109 | * `datastore_storage_type`    `` 110 |
Where data in a data store is stored.. You can choose ```serviceManagedS3``` storage, ```customerManagedS3``` storage, or ```iotSiteWiseMultiLayerStorage``` storage. The default is ```serviceManagedS3```. You can't change the choice of Amazon S3 storage after your data store is created. In this version of the project there is no support for ```iotSiteWiseMultiLayerStorage``` storage. 111 |
__Format__: You should either include ```"datastore_storage_type": "service_managed"``` or ```"datastore_storage_type": "customer_managed"``` in the cdk.json file or command line. 112 | 113 | * `file_format_configuration`    `` 114 |
Contains the configuration information of file formats. IoT Analytics data stores support JSON and Parquet. The default file format is JSON. You can specify only one format and you can't change the file format after you create the data store. 115 |
__Format__: You should either include ```"file_format_configuration": "json"``` or ```"file_format_configuration": "parquet"``` in the cdk.json file or command line. 116 | 117 | * `parquet_file_format_schema_columns`    `` 118 |
Contains the configuration information of the Parquet format. This parameter is used only if you have set ```file_format_configuration``` to ```"parquet"```. 119 |
__Format__: The input should be a list of dictionaries. Each dictionary represents a single column and should be of the format of ```{"name": name, "type": type}```. 120 | 121 | Enjoy! 122 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/IoTAnalyticsPattern/app.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | import aws_cdk as cdk 4 | 5 | from io_t_analytics_pattern.io_t_analytics_pattern_stack import IoTAnalyticsPatternStack 6 | 7 | 8 | app = cdk.App() 9 | IoTAnalyticsPatternStack(app, "IoTAnalyticsPatternStack", 10 | # If you don't specify 'env', this stack will be environment-agnostic. 11 | # Account/Region-dependent features and context lookups will not work, 12 | # but a single synthesized template can be deployed anywhere. 13 | 14 | # Uncomment the next line to specialize this stack for the AWS Account 15 | # and Region that are implied by the current CLI configuration. 16 | 17 | #env=cdk.Environment(account=os.getenv('CDK_DEFAULT_ACCOUNT'), region=os.getenv('CDK_DEFAULT_REGION')), 18 | 19 | # Uncomment the next line if you know exactly what Account and Region you 20 | # want to deploy the stack to. */ 21 | 22 | #env=cdk.Environment(account='123456789012', region='us-east-1'), 23 | 24 | # For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html 25 | ) 26 | 27 | app.synth() 28 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/IoTAnalyticsPattern/cdk.json: -------------------------------------------------------------------------------- 1 | { 2 | "app": "python3 app.py", 3 | "watch": { 4 | "include": [ 5 | "**" 6 | ], 7 | "exclude": [ 8 | "README.md", 9 | "cdk*.json", 10 | "requirements*.txt", 11 | "source.bat", 12 | "**/__init__.py", 13 | "python/__pycache__", 14 | "tests" 15 | ] 16 | }, 17 | "context": { 18 | "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, 19 | "@aws-cdk/core:stackRelativeExports": true, 20 | "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, 21 | "@aws-cdk/aws-lambda:recognizeVersionProps": true, 22 | "@aws-cdk/aws-lambda:recognizeLayerVersion": true, 23 | "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true, 24 | "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, 25 | "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, 26 | "@aws-cdk/core:checkSecretUsage": true, 27 | "@aws-cdk/aws-iam:minimizePolicies": true, 28 | "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, 29 | "@aws-cdk/core:validateSnapshotRemovalPolicy": true, 30 | "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, 31 | "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, 32 | "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, 33 | "@aws-cdk/core:target-partitions": [ 34 | "aws", 35 | "aws-cn" 36 | ], 37 | "topic_sql": "SELECT *, parse_time(\"YYYY-MM-dd'T'hh:mm:ss\", timestamp()) as Time FROM 'IoT_Analytics_demo'", 38 | "analytics_channel_name": "demo_iot_channel", 39 | "analytics_datastore_name": "demo_iot_datastore", 40 | "analytics_dataset_name": "demo_iot_dataset", 41 | "analytics_pipeline_name": "demo_iot_pipeline", 42 | "analytics_iot_role_name": "demo_iot_iotanalytics_role", 43 | "analytics_iot_rule_name": "demo_to_iotanalytics_rule", 44 | "channel_storage_type": "service_managed", 45 | "datastore_storage_type": "service_managed", 46 | "file_format_configuration": "json", 47 | "parquet_file_format_schema_columns" : [{"name": "device_id", "type": "string"}] 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/IoTAnalyticsPattern/io_t_analytics_pattern/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/cloud_templates/aws_cdk/IoTAnalyticsPattern/io_t_analytics_pattern/__init__.py -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/IoTAnalyticsPattern/requirements-dev.txt: -------------------------------------------------------------------------------- 1 | pytest==6.2.5 2 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/IoTAnalyticsPattern/requirements.txt: -------------------------------------------------------------------------------- 1 | aws-cdk-lib==2.37.1 2 | constructs>=10.0.0,<11.0.0 3 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/IoTAnalyticsPattern/source.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | rem The sole purpose of this script is to make the command 4 | rem 5 | rem source .venv/bin/activate 6 | rem 7 | rem (which activates a Python virtualenv on Linux or Mac OS X) work on Windows. 8 | rem On Windows, this command just runs this batch file (the argument is ignored). 9 | rem 10 | rem Now we don't need to document a Windows command for activating a virtualenv. 11 | 12 | echo Executing .venv\Scripts\activate.bat for you 13 | .venv\Scripts\activate.bat 14 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/IoTAnalyticsPattern/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/cloud_templates/aws_cdk/IoTAnalyticsPattern/tests/__init__.py -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/IoTAnalyticsPattern/tests/unit/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/cloud_templates/aws_cdk/IoTAnalyticsPattern/tests/unit/__init__.py -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/KinesisPattern/.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | __pycache__ 3 | .pytest_cache 4 | .venv 5 | *.egg-info 6 | 7 | # CDK asset staging directory 8 | .cdk.staging 9 | cdk.out 10 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/KinesisPattern/README.md: -------------------------------------------------------------------------------- 1 | 2 | # Welcome to your CDK project! 3 | # IoT Data visulaization with Amazon Kinesis 4 | 5 | The `cdk.json` file tells the CDK Toolkit how to execute your app. 6 | 7 | This project is set up like a standard Python project. The initialization 8 | process also creates a virtualenv within this project, stored under the `.venv` 9 | directory. To create the virtualenv it assumes that there is a `python3` 10 | (or `python` for Windows) executable in your path with access to the `venv` 11 | package. If for any reason the automatic creation of the virtualenv fails, 12 | you can create the virtualenv manually. 13 | 14 | To manually create a virtualenv on MacOS and Linux: 15 | 16 | ``` 17 | $ python3 -m venv .venv 18 | ``` 19 | 20 | After the init process completes and the virtualenv is created, you can use the following 21 | step to activate your virtualenv. 22 | 23 | ``` 24 | $ source .venv/bin/activate 25 | ``` 26 | 27 | If you are a Windows platform, you would activate the virtualenv like this: 28 | 29 | ``` 30 | % .venv\Scripts\activate.bat 31 | ``` 32 | 33 | Once the virtualenv is activated, you can install the required dependencies. 34 | 35 | ``` 36 | $ pip install -r requirements.txt 37 | ``` 38 | 39 | At this point you can now synthesize the CloudFormation template for this code. 40 | 41 | ``` 42 | $ cdk synth 43 | ``` 44 | 45 | To add additional dependencies, for example other CDK libraries, just add 46 | them to your `setup.py` file and rerun the `pip install -r requirements.txt` 47 | command. 48 | 49 | ## Useful commands 50 | 51 | * `cdk ls` list all stacks in the app 52 | * `cdk synth` emits the synthesized CloudFormation template 53 | * `cdk deploy` deploy this stack to your default AWS account/region 54 | * `cdk diff` compare deployed stack with current state 55 | * `cdk docs` open CDK documentation 56 | 57 | ## Context parameters 58 | There are multiple context parameters that you need to set before synthesizing or delpoying this CDK stack. You can specify a context variable either as part of an AWS CDK CLI command, or in `cdk.json`. 59 | To create a command line context variable, use the __--context (-c) option__, as shown in the following example. 60 | 61 | ``` 62 | $ cdk cdk synth -c bucket_name=mybucket 63 | ``` 64 | 65 | To specify the same context variable and value in the cdk.json file, use the following code. 66 | 67 | ``` 68 | { 69 | "context": { 70 | "bucket_name": "mybucket" 71 | } 72 | } 73 | ``` 74 | 75 | In this project, these are the following parameters to be set: 76 | 77 | * `topic_sql` 78 | It is required for IoT Core rule creation to add a simplified SQL syntax to filter messages received on an MQTT topic and push the data elsewhere. 79 |
__Format__: Enter an SQL statement using the following: ```SELECT FROM WHERE ```. For example: ```SELECT temperature FROM 'iot/topic' WHERE temperature > 50```. To learn more, see AWS IoT SQL Reference. 80 | 81 | * `kinesis_destination_bucket_name`    `` 82 | To specify the destination settings for your delivery stream, a s3 bucket must be created and this parameter is for setting the name of it. 83 |
__Format__: Bucket name must be unique and must not contain spaces or uppercase letters. [See rules for bucket naming](https://docs.aws.amazon.com/console/s3/bucket-naming) 84 | 85 | * `kinesis_delivery_stream_name`    `` 86 | The name of the Kinesis delivery stream to get your data and send them to the s3 bucket. 87 |
__Format__: Acceptable characters are uppercase and lowercase letters, numbers, underscores, hyphens, and periods. 88 | 89 | * `kinesis_delivery_stream_role_name`    `` 90 | An IAM role should be created to grant Firehose access to your s3 bucket. This parameter is for setting the name of this role. 91 |
__Format__: Enter a unique role name that contains alphanumeric characters, hyphens, and underscores. A role name can't contain any spaces. 92 | 93 | * `kinesis_iot_rule_name`    `` 94 | The name of the IoT Core rule that is going to be created. 95 |
__Format__: Should be an alphanumeric string that can also contain underscore (_) characters, but no spaces. 96 | 97 | * `kinesis_iot_role_name`    `` 98 | An IAM role should be created to grant AWS IoT access to your endpoint. This parameter is for setting the name of this role. 99 |
__Format__: Enter a unique role name that contains alphanumeric characters, hyphens, and underscores. A role name can't contain any spaces. 100 | 101 | * `glue_crawler_name`    `` 102 | A Glue crawler should be created to crawl the data in your s3 bucket. This parameter is for setting the name of this cralwer. 103 | 104 | * `glue_db_name`    `` 105 | A Glue database should be created to connect to the crawler and store data. This parameter is for setting the name of this database. 106 | 107 | * `glue_crawler_role_name`    `` 108 | An IAM role should be created to grant Glue access to your s3 bucket. This parameter is for setting the name of this role. 109 |
__Format__: Enter a unique role name that contains alphanumeric characters, hyphens, and underscores. A role name can't contain any spaces. 110 | 111 | Enjoy! 112 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/KinesisPattern/app.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | import aws_cdk as cdk 4 | 5 | from kinesis_pattern.kinesis_pattern_stack import KinesisPatternStack 6 | 7 | 8 | app = cdk.App() 9 | KinesisPatternStack(app, "KinesisPatternStack", 10 | # If you don't specify 'env', this stack will be environment-agnostic. 11 | # Account/Region-dependent features and context lookups will not work, 12 | # but a single synthesized template can be deployed anywhere. 13 | 14 | # Uncomment the next line to specialize this stack for the AWS Account 15 | # and Region that are implied by the current CLI configuration. 16 | 17 | #env=cdk.Environment(account=os.getenv('CDK_DEFAULT_ACCOUNT'), region=os.getenv('CDK_DEFAULT_REGION')), 18 | 19 | # Uncomment the next line if you know exactly what Account and Region you 20 | # want to deploy the stack to. */ 21 | 22 | #env=cdk.Environment(account='123456789012', region='us-east-1'), 23 | 24 | # For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html 25 | ) 26 | 27 | app.synth() 28 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/KinesisPattern/cdk.json: -------------------------------------------------------------------------------- 1 | { 2 | "app": "python3 app.py", 3 | "watch": { 4 | "include": [ 5 | "**" 6 | ], 7 | "exclude": [ 8 | "README.md", 9 | "cdk*.json", 10 | "requirements*.txt", 11 | "source.bat", 12 | "**/__init__.py", 13 | "python/__pycache__", 14 | "tests" 15 | ] 16 | }, 17 | "context": { 18 | "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, 19 | "@aws-cdk/core:stackRelativeExports": true, 20 | "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, 21 | "@aws-cdk/aws-lambda:recognizeVersionProps": true, 22 | "@aws-cdk/aws-lambda:recognizeLayerVersion": true, 23 | "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true, 24 | "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, 25 | "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, 26 | "@aws-cdk/core:checkSecretUsage": true, 27 | "@aws-cdk/aws-iam:minimizePolicies": true, 28 | "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, 29 | "@aws-cdk/core:validateSnapshotRemovalPolicy": true, 30 | "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, 31 | "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, 32 | "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, 33 | "@aws-cdk/core:target-partitions": [ 34 | "aws", 35 | "aws-cn" 36 | ], 37 | "topic_sql": "SELECT *, parse_time(\"YYYY-MM-dd'T'hh:mm:ss\", timestamp()) as Time FROM 'Kinesis_demo'", 38 | "kinesis_destination_bucket_name": "demo-kinesis-bucket", 39 | "kinesis_delivery_stream_role_name": "demo_kinesis_delivery_stream_role", 40 | "kinesis_delivery_stream_name": "demo_delivery_stream", 41 | "kinesis_iot_role_name": "demo_iot_kinesis_role", 42 | "kinesis_iot_rule_name": "demo_to_kinesis_rule", 43 | "glue_db_name": "demo_glue_db", 44 | "glue_crawler_role_name": "demo_glue_crawler_role", 45 | "glue_crawler_name": "demo_glue_crawler" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/KinesisPattern/kinesis_pattern/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/cloud_templates/aws_cdk/KinesisPattern/kinesis_pattern/__init__.py -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/KinesisPattern/requirements-dev.txt: -------------------------------------------------------------------------------- 1 | pytest==6.2.5 2 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/KinesisPattern/requirements.txt: -------------------------------------------------------------------------------- 1 | aws-cdk-lib==2.37.1 2 | constructs>=10.0.0,<11.0.0 3 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/KinesisPattern/source.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | rem The sole purpose of this script is to make the command 4 | rem 5 | rem source .venv/bin/activate 6 | rem 7 | rem (which activates a Python virtualenv on Linux or Mac OS X) work on Windows. 8 | rem On Windows, this command just runs this batch file (the argument is ignored). 9 | rem 10 | rem Now we don't need to document a Windows command for activating a virtualenv. 11 | 12 | echo Executing .venv\Scripts\activate.bat for you 13 | .venv\Scripts\activate.bat 14 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/KinesisPattern/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/cloud_templates/aws_cdk/KinesisPattern/tests/__init__.py -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/KinesisPattern/tests/unit/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/cloud_templates/aws_cdk/KinesisPattern/tests/unit/__init__.py -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/OpenSearchPattern/.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | __pycache__ 3 | .pytest_cache 4 | .venv 5 | *.egg-info 6 | 7 | # CDK asset staging directory 8 | .cdk.staging 9 | cdk.out 10 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/OpenSearchPattern/README.md: -------------------------------------------------------------------------------- 1 | 2 | # Welcome to your CDK project! 3 | # IoT Data visulaization with Amazon Opensearch Service 4 | 5 | The `cdk.json` file tells the CDK Toolkit how to execute your app. 6 | 7 | This project is set up like a standard Python project. The initialization 8 | process also creates a virtualenv within this project, stored under the `.venv` 9 | directory. To create the virtualenv it assumes that there is a `python3` 10 | (or `python` for Windows) executable in your path with access to the `venv` 11 | package. If for any reason the automatic creation of the virtualenv fails, 12 | you can create the virtualenv manually. 13 | 14 | To manually create a virtualenv on MacOS and Linux: 15 | 16 | ``` 17 | $ python3 -m venv .venv 18 | ``` 19 | 20 | After the init process completes and the virtualenv is created, you can use the following 21 | step to activate your virtualenv. 22 | 23 | ``` 24 | $ source .venv/bin/activate 25 | ``` 26 | 27 | If you are a Windows platform, you would activate the virtualenv like this: 28 | 29 | ``` 30 | % .venv\Scripts\activate.bat 31 | ``` 32 | 33 | Once the virtualenv is activated, you can install the required dependencies. 34 | 35 | ``` 36 | $ pip install -r requirements.txt 37 | ``` 38 | 39 | At this point you can now synthesize the CloudFormation template for this code. 40 | 41 | ``` 42 | $ cdk synth 43 | ``` 44 | 45 | To add additional dependencies, for example other CDK libraries, just add 46 | them to your `setup.py` file and rerun the `pip install -r requirements.txt` 47 | command. 48 | 49 | ## Useful commands 50 | 51 | * `cdk ls` list all stacks in the app 52 | * `cdk synth` emits the synthesized CloudFormation template 53 | * `cdk deploy` deploy this stack to your default AWS account/region 54 | * `cdk diff` compare deployed stack with current state 55 | * `cdk docs` open CDK documentation 56 | 57 | ## Context parameters 58 | There are multiple context parameters that you need to set before synthesizing or delpoying this CDK stack. You can specify a context variable either as part of an AWS CDK CLI command, or in `cdk.json`. 59 | To create a command line context variable, use the __--context (-c) option__, as shown in the following example. 60 | 61 | ``` 62 | $ cdk cdk synth -c bucket_name=mybucket 63 | ``` 64 | 65 | To specify the same context variable and value in the cdk.json file, use the following code. 66 | 67 | ``` 68 | { 69 | "context": { 70 | "bucket_name": "mybucket" 71 | } 72 | } 73 | ``` 74 | 75 | In this project, these are the following parameters to be set: 76 | 77 | * `topic_sql` 78 | It is required for IoT Core rule creation to add a simplified SQL syntax to filter messages received on an MQTT topic and push the data elsewhere. 79 |
__Format__: Enter an SQL statement using the following: ```SELECT FROM WHERE ```. For example: ```SELECT temperature FROM 'iot/topic' WHERE temperature > 50```. To learn more, see AWS IoT SQL Reference. 80 | 81 | * `opensearch_domain_name`    `` 82 | The name of the Opensearch domain that will be created. 83 |
__Format__: The name must start with a lowercase letter and must be between 3 and 28 characters. Valid characters are a-z (lowercase only), 0-9, and - (hyphen). 84 | 85 | * `opensearch_index_name`    `` 86 | Before you can search data, you must index it. Indexing is the method by which search engines organize data for fast retrieval. The resulting structure is called, fittingly, an index. The name of the index that the IoT Core will use to send data to Opensearch is set via this parameter. 87 |
__Format__: OpenSearch Service indexes have the following naming restrictions: 88 | 89 | * All letters must be lowercase. 90 | 91 | * Index names cannot begin with `_` or `-`. 92 | 93 | * Index names can't contain `spaces, commas, :, ", *, +, /, \, |, ?, #, >, or <`. 94 | 95 | * `opensearch_type_name`    `` 96 | It resresents the type of the document that is going to be put under the index. Take the following example:
``` { 97 | "_index" : "movies", 98 | "_type" : "_doc", 99 | "_id" : "1", 100 | "_score" : 0.2876821, 101 | "_source" : { 102 | "director" : "Burton, Tim", 103 | "genre" : [ 104 | "Comedy", 105 | "Sci-Fi" 106 | ], 107 | "year" : 1996, 108 | "actor" : [ 109 | "Jack Nicholson", 110 | "Pierce Brosnan", 111 | "Sarah Jessica Parker" 112 | ], 113 | "title" : "Mars Attacks!" 114 | }``` 115 | 116 | * `cognito_user_pool_name`    `` 117 | During the user pool creation process, you must specify a user pool name. This name can't be changed after the user pool has been created. 118 |
__Format__: User pool names must be between one and 128 characters long. They can contain uppercase and lowercase letters (a-z, A-Z), numbers (0-9), and the following special characters: + = , . @ and -. 119 | 120 | * `cognito_user_pool_domain_name`    `` 121 | The domain name for the domain that hosts the sign-up and sign-in pages for your application. 122 |
__Format__: This string can include only lowercase letters, numbers, and hyphens. Don't use a hyphen for the first or last character. Use periods to separate subdomain names. It must be between 1 and 63 characters. 123 | 124 | * `cognito_identity_pool_name`    `` 125 | Identity pools are used to store end user identities. To declare a new identity pool, you should provide a unique name. 126 |
__Format__: It must be between 1 and 128 characters and follow such pattern: ```[\w\s+=,.@-]+ ``` 127 | 128 | * `cognito_user_username`    `` 129 | Each user has a username attribute. Amazon Cognito automatically generates a user name for federated users. You must provide a username attribute to create a native user in the Amazon Cognito directory. After you create a user, you can't change the value of the username attribute. 130 | 131 | * `iot_to_opensearch_rule_name`    `` 132 | The name of the IoT Core rule that is going to be created. 133 |
__Format__: Should be an alphanumeric string that can also contain underscore (_) characters, but no spaces 134 | 135 | * `iot_to_opensearch_role_name`    `` 136 | An IAM role should be created to grant AWS IoT access to Opensearch. This parameter is for setting the name of this role. 137 |
__Format__: Enter a unique role name that contains alphanumeric characters, hyphens, and underscores. A role name can't contain any spaces. 138 | 139 | * `opensearch_domain_capacity_config`    `` 140 | Configures the capacity of the cluster such as the instance type and the number of instances. 141 |
__Format__: Your input must be in the following format: 142 |
143 | 144 | ``` 145 | # Do not include "opensearch_domain_master_nodes" and "opensearch_domain_warm_nodes" keys if you do not want them in your cluster's config. 146 | { 147 | "opensearch_domain_data_nodes": , 148 | "opensearch_domain_data_node_instance_type": , 149 | "opensearch_domain_master_nodes": , 150 | "opensearch_domain_warm_nodes": 151 | } 152 | ``` 153 | 154 | Enjoy! 155 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/OpenSearchPattern/app.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | import aws_cdk as cdk 4 | 5 | from open_search_pattern.open_search_pattern_stack import OpenSearchPatternStack 6 | 7 | 8 | app = cdk.App() 9 | OpenSearchPatternStack(app, "OpenSearchPatternStack", 10 | # If you don't specify 'env', this stack will be environment-agnostic. 11 | # Account/Region-dependent features and context lookups will not work, 12 | # but a single synthesized template can be deployed anywhere. 13 | 14 | # Uncomment the next line to specialize this stack for the AWS Account 15 | # and Region that are implied by the current CLI configuration. 16 | 17 | #env=cdk.Environment(account=os.getenv('CDK_DEFAULT_ACCOUNT'), region=os.getenv('CDK_DEFAULT_REGION')), 18 | 19 | # Uncomment the next line if you know exactly what Account and Region you 20 | # want to deploy the stack to. */ 21 | 22 | #env=cdk.Environment(account='123456789012', region='us-east-1'), 23 | 24 | # For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html 25 | ) 26 | 27 | app.synth() -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/OpenSearchPattern/cdk.json: -------------------------------------------------------------------------------- 1 | { 2 | "app": "python3 app.py", 3 | "watch": { 4 | "include": [ 5 | "**" 6 | ], 7 | "exclude": [ 8 | "README.md", 9 | "cdk*.json", 10 | "requirements*.txt", 11 | "source.bat", 12 | "**/__init__.py", 13 | "python/__pycache__", 14 | "tests" 15 | ] 16 | }, 17 | "context": { 18 | "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, 19 | "@aws-cdk/core:stackRelativeExports": true, 20 | "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, 21 | "@aws-cdk/aws-lambda:recognizeVersionProps": true, 22 | "@aws-cdk/aws-lambda:recognizeLayerVersion": true, 23 | "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true, 24 | "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, 25 | "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, 26 | "@aws-cdk/core:checkSecretUsage": true, 27 | "@aws-cdk/aws-iam:minimizePolicies": true, 28 | "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, 29 | "@aws-cdk/core:validateSnapshotRemovalPolicy": true, 30 | "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, 31 | "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, 32 | "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, 33 | "@aws-cdk/core:target-partitions": [ 34 | "aws", 35 | "aws-cn" 36 | ], 37 | "topic_sql": "SELECT *, parse_time(\"YYYY-MM-dd'T'hh:mm:ss\", timestamp()) as Time FROM 'Opensearch_demo'", 38 | "opensearch_domain_name": "opensearch-demo-domain", 39 | "opensearch_index_name": "iot", 40 | "opensearch_type_name": "_doc", 41 | "iot_to_opensearch_rule_name": "demo_to_opensearch_rule", 42 | "iot_to_opensearch_role_name": "demo_iot_opensearch_role", 43 | "cognito_user_pool_name" : "DemoUserPool", 44 | "cognito_identity_pool_name": "DemoIdentityPool", 45 | "cognito_user_pool_domain_name": "iot-demo-domain", 46 | "cognito_user_username": "admin", 47 | "opensearch_domain_capacity_config": { 48 | "opensearch_domain_data_nodes": 3, 49 | "opensearch_domain_data_node_instance_type": "t3.small.search" 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/OpenSearchPattern/open_search_pattern/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/cloud_templates/aws_cdk/OpenSearchPattern/open_search_pattern/__init__.py -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/OpenSearchPattern/requirements-dev.txt: -------------------------------------------------------------------------------- 1 | pytest==6.2.5 2 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/OpenSearchPattern/requirements.txt: -------------------------------------------------------------------------------- 1 | aws-cdk-lib==2.37.1 2 | constructs>=10.0.0,<11.0.0 3 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/OpenSearchPattern/source.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | rem The sole purpose of this script is to make the command 4 | rem 5 | rem source .venv/bin/activate 6 | rem 7 | rem (which activates a Python virtualenv on Linux or Mac OS X) work on Windows. 8 | rem On Windows, this command just runs this batch file (the argument is ignored). 9 | rem 10 | rem Now we don't need to document a Windows command for activating a virtualenv. 11 | 12 | echo Executing .venv\Scripts\activate.bat for you 13 | .venv\Scripts\activate.bat 14 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/OpenSearchPattern/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/cloud_templates/aws_cdk/OpenSearchPattern/tests/__init__.py -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/OpenSearchPattern/tests/unit/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/cloud_templates/aws_cdk/OpenSearchPattern/tests/unit/__init__.py -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/TimestreamPattern/.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | __pycache__ 3 | .pytest_cache 4 | .venv 5 | *.egg-info 6 | 7 | # CDK asset staging directory 8 | .cdk.staging 9 | cdk.out 10 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/TimestreamPattern/README.md: -------------------------------------------------------------------------------- 1 | 2 | # Welcome to your CDK project! 3 | # IoT Data visulaization with Amazon Timestream 4 | 5 | The `cdk.json` file tells the CDK Toolkit how to execute your app. 6 | 7 | This project is set up like a standard Python project. The initialization 8 | process also creates a virtualenv within this project, stored under the `.venv` 9 | directory. To create the virtualenv it assumes that there is a `python3` 10 | (or `python` for Windows) executable in your path with access to the `venv` 11 | package. If for any reason the automatic creation of the virtualenv fails, 12 | you can create the virtualenv manually. 13 | 14 | To manually create a virtualenv on MacOS and Linux: 15 | 16 | ``` 17 | $ python3 -m venv .venv 18 | ``` 19 | 20 | After the init process completes and the virtualenv is created, you can use the following 21 | step to activate your virtualenv. 22 | 23 | ``` 24 | $ source .venv/bin/activate 25 | ``` 26 | 27 | If you are a Windows platform, you would activate the virtualenv like this: 28 | 29 | ``` 30 | % .venv\Scripts\activate.bat 31 | ``` 32 | 33 | Once the virtualenv is activated, you can install the required dependencies. 34 | 35 | ``` 36 | $ pip install -r requirements.txt 37 | ``` 38 | 39 | At this point you can now synthesize the CloudFormation template for this code. 40 | 41 | ``` 42 | $ cdk synth 43 | ``` 44 | 45 | To add additional dependencies, for example other CDK libraries, just add 46 | them to your `setup.py` file and rerun the `pip install -r requirements.txt` 47 | command. 48 | 49 | ## Useful commands 50 | 51 | * `cdk ls` list all stacks in the app 52 | * `cdk synth` emits the synthesized CloudFormation template 53 | * `cdk deploy` deploy this stack to your default AWS account/region 54 | * `cdk diff` compare deployed stack with current state 55 | * `cdk docs` open CDK documentation 56 | 57 | ## Context parameters 58 | There are multiple context parameters that you need to set before synthesizing or delpoying this CDK stack. You can specify a context variable either as part of an AWS CDK CLI command, or in `cdk.json`. 59 | To create a command line context variable, use the __--context (-c) option__, as shown in the following example. 60 | 61 | ``` 62 | $ cdk cdk synth -c bucket_name=mybucket 63 | ``` 64 | 65 | To specify the same context variable and value in the cdk.json file, use the following sample code. 66 | 67 | ``` 68 | { 69 | "context": { 70 | "bucket_name": "mybucket" 71 | } 72 | } 73 | ``` 74 | 75 | In this project, these are the following parameters to be set: 76 | 77 | * `topic_sql` 78 |
It is required for IoT Core rule creation to add a simplified SQL syntax to filter messages received on an MQTT topic and push the data elsewhere. 79 |
__Format__: Enter an SQL statement using the following: ```SELECT FROM WHERE ```. For example: ```SELECT temperature FROM 'iot/topic' WHERE temperature > 50```. To learn more, see AWS IoT SQL Reference. 80 | 81 | * `dimensions` 82 |
Each record contains an array of dimensions (minimum 1). Dimensions represent the metadata attributes of a time series data point. Specify the dimension(s) for your data. 83 |
__Format__: Must be in a format of a list of strings. For example, for the input ```[device_id]``` the following key-value would be attached to the IoT Core rule: 84 |
```{dimension's name: device_id, dimension_value: ${device_id}}```
85 | 86 | * `timestream_db_name`    `` 87 |
The name of Timestream databse to hold your data. 88 |
__Format__: Specify a name that is unique for all Timestream databases in your AWS account in the current Region. You can not change this name once you create it. Must be between 3 and 256 characters long. Must contain letters, digits, dashes, periods or underscores. 89 | 90 | * `timestream_table_name`    `` 91 |
The name of Timestream databse to hold your data. 92 |
__Format__: Specify a table name that is unique within its database. You can not change this name once you create it. Must be between 3 and 256 characters long. Must contain letters, digits, dashes, periods or underscores. 93 | 94 | * `timestream_iot_rule_name`    `` 95 |
The name of the IoT Core rule that is going to be created. 96 |
__Format__: Should be an alphanumeric string that can also contain underscore (_) characters, but no spaces. 97 | 98 | * `timestream_iot_role_name`    `` 99 |
An IAM role should be created to grant AWS IoT access to your endpoint. This parameter is for setting the name of this role. 100 |
__Format__: Enter a unique role name that contains alphanumeric characters, hyphens, and underscores. A role name can't contain any spaces. 101 | 102 | Enjoy! -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/TimestreamPattern/app.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | import aws_cdk as cdk 4 | 5 | from timestream_pattern.timestream_pattern_stack import TimestreamPatternStack 6 | 7 | 8 | app = cdk.App() 9 | TimestreamPatternStack(app, "TimestreamPatternStack", 10 | # If you don't specify 'env', this stack will be environment-agnostic. 11 | # Account/Region-dependent features and context lookups will not work, 12 | # but a single synthesized template can be deployed anywhere. 13 | 14 | # Uncomment the next line to specialize this stack for the AWS Account 15 | # and Region that are implied by the current CLI configuration. 16 | 17 | #env=cdk.Environment(account=os.getenv('CDK_DEFAULT_ACCOUNT'), region=os.getenv('CDK_DEFAULT_REGION')), 18 | 19 | # Uncomment the next line if you know exactly what Account and Region you 20 | # want to deploy the stack to. */ 21 | 22 | #env=cdk.Environment(account='123456789012', region='us-east-1'), 23 | 24 | # For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html 25 | ) 26 | 27 | app.synth() 28 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/TimestreamPattern/cdk.json: -------------------------------------------------------------------------------- 1 | { 2 | "app": "python3 app.py", 3 | "watch": { 4 | "include": [ 5 | "**" 6 | ], 7 | "exclude": [ 8 | "README.md", 9 | "cdk*.json", 10 | "requirements*.txt", 11 | "source.bat", 12 | "**/__init__.py", 13 | "python/__pycache__", 14 | "tests" 15 | ] 16 | }, 17 | "context": { 18 | "@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true, 19 | "@aws-cdk/core:stackRelativeExports": true, 20 | "@aws-cdk/aws-rds:lowercaseDbIdentifier": true, 21 | "@aws-cdk/aws-lambda:recognizeVersionProps": true, 22 | "@aws-cdk/aws-lambda:recognizeLayerVersion": true, 23 | "@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true, 24 | "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, 25 | "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, 26 | "@aws-cdk/core:checkSecretUsage": true, 27 | "@aws-cdk/aws-iam:minimizePolicies": true, 28 | "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, 29 | "@aws-cdk/core:validateSnapshotRemovalPolicy": true, 30 | "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, 31 | "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, 32 | "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, 33 | "@aws-cdk/core:target-partitions": [ 34 | "aws", 35 | "aws-cn" 36 | ], 37 | "topic_sql": "SELECT * FROM 'Timestream_demo'", 38 | "dimensions": ["Location"], 39 | "timestream_db_name": "demo_db", 40 | "timestream_table_name": "demo_table", 41 | "timestream_iot_role_name": "demo_iot_timestream_role", 42 | "timestream_iot_rule_name": "demo_to_timetream_rule" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/TimestreamPattern/requirements-dev.txt: -------------------------------------------------------------------------------- 1 | pytest==6.2.5 2 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/TimestreamPattern/requirements.txt: -------------------------------------------------------------------------------- 1 | aws-cdk-lib==2.37.1 2 | constructs>=10.0.0,<11.0.0 3 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/TimestreamPattern/source.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | rem The sole purpose of this script is to make the command 4 | rem 5 | rem source .venv/bin/activate 6 | rem 7 | rem (which activates a Python virtualenv on Linux or Mac OS X) work on Windows. 8 | rem On Windows, this command just runs this batch file (the argument is ignored). 9 | rem 10 | rem Now we don't need to document a Windows command for activating a virtualenv. 11 | 12 | echo Executing .venv\Scripts\activate.bat for you 13 | .venv\Scripts\activate.bat 14 | -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/TimestreamPattern/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/cloud_templates/aws_cdk/TimestreamPattern/tests/__init__.py -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/TimestreamPattern/tests/unit/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/cloud_templates/aws_cdk/TimestreamPattern/tests/unit/__init__.py -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/TimestreamPattern/timestream_pattern/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/cloud_templates/aws_cdk/TimestreamPattern/timestream_pattern/__init__.py -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/TimestreamPattern/timestream_pattern/timestream_pattern_stack.py: -------------------------------------------------------------------------------- 1 | import string 2 | import sys 3 | import re 4 | from aws_cdk import ( 5 | Stack, 6 | aws_timestream as timestream, 7 | aws_iot as iot, 8 | aws_iam as iam, 9 | aws_logs as logs 10 | ) 11 | from constructs import Construct 12 | import aws_cdk as cdk 13 | 14 | sys.path.append('../') 15 | from common.inputValidation import * 16 | 17 | class TimestreamPatternStack(Stack): 18 | 19 | # Defining class variables 20 | dimensions_list = [] 21 | topic_sql = "" 22 | timestream_db_name = "" 23 | timestream_table_name = "" 24 | timestream_iot_role_name = "" 25 | timestream_iot_rule_name = "" 26 | 27 | 28 | def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: 29 | super().__init__(scope, construct_id, **kwargs) 30 | 31 | # Getting the context parameters 32 | 33 | # Required parameters for users to set in the CLI command or cdk.json 34 | self.dimensions_list = self.node.try_get_context("dimensions") 35 | self.topic_sql = self.node.try_get_context("topic_sql") 36 | 37 | # Optional parameters for users to set in the CLI command or cdk.json 38 | self.timestream_db_name = self.node.try_get_context("timestream_db_name") 39 | self.timestream_table_name = self.node.try_get_context("timestream_table_name") 40 | self.timestream_iot_role_name = self.node.try_get_context("timestream_iot_role_name") 41 | self.timestream_iot_rule_name = self.node.try_get_context("timestream_iot_rule_name") 42 | 43 | # Perform input validation 44 | self.performInputValidation() 45 | 46 | # Creating the timestream database 47 | timestream_database = timestream.CfnDatabase(self, self.timestream_db_name, database_name=self.timestream_db_name) 48 | timestream_database.apply_removal_policy(policy=cdk.RemovalPolicy.DESTROY) 49 | 50 | # Creating the timestream table under the database previously made 51 | timestream_table = timestream.CfnTable(self, self.timestream_table_name, database_name=self.timestream_db_name, 52 | retention_properties={"MemoryStoreRetentionPeriodInHours": "24", "MagneticStoreRetentionPeriodInDays": "7"}, table_name=self.timestream_table_name) 53 | timestream_table.node.add_dependency(timestream_database) 54 | timestream_table.apply_removal_policy(policy=cdk.RemovalPolicy.DESTROY) 55 | 56 | # Creating the role for the IoT-Timestream rule 57 | iot_timestream_role = iam.Role(self, self.timestream_iot_role_name, assumed_by=iam.ServicePrincipal("iot.amazonaws.com")) 58 | iot_timestream_role.add_to_policy(iam.PolicyStatement(effect=iam.Effect.ALLOW, resources=[timestream_table.attr_arn], actions=["timestream:WriteRecords"])) 59 | iot_timestream_role.add_to_policy(iam.PolicyStatement(effect=iam.Effect.ALLOW, resources=["*"], actions=["timestream:DescribeEndpoints"])) 60 | iot_timestream_role.node.add_dependency(timestream_table) 61 | iot_timestream_role.apply_removal_policy(policy=cdk.RemovalPolicy.DESTROY) 62 | 63 | # Creating the dimension list based on the user input 64 | dimensions = [iot.CfnTopicRule.TimestreamDimensionProperty(name = dim, value = "${" + dim + "}") for dim in self.dimensions_list] 65 | 66 | # Creating a cloudwatch log group for topic rule's error action 67 | log_group = logs.LogGroup(self, "iot_to_timestream_log_group" , log_group_name="iot_to_timestream_log_group", removal_policy=cdk.RemovalPolicy.DESTROY) 68 | 69 | iot_to_cloudwatch_logs_role = iam.Role(self, "iot_to_log_group_role", assumed_by=iam.ServicePrincipal("iot.amazonaws.com")) 70 | iot_to_cloudwatch_logs_role.add_to_policy(iam.PolicyStatement( 71 | effect=iam.Effect.ALLOW, resources=[log_group.log_group_arn], 72 | actions=["logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "logs:PutMetricFilter", "logs:PutRetentionPolicy"])) 73 | iot_to_cloudwatch_logs_role.node.add_dependency(log_group) 74 | iot_to_cloudwatch_logs_role.apply_removal_policy(policy=cdk.RemovalPolicy.DESTROY) 75 | 76 | # Creating the IoT Topic Rule 77 | topic_rule = iot.CfnTopicRule(self, self.timestream_iot_rule_name, topic_rule_payload=iot.CfnTopicRule.TopicRulePayloadProperty( 78 | actions=[iot.CfnTopicRule.ActionProperty(timestream=iot.CfnTopicRule.TimestreamActionProperty( 79 | database_name=self.timestream_db_name, 80 | dimensions=dimensions, 81 | role_arn=iot_timestream_role.role_arn, 82 | table_name=self.timestream_table_name 83 | ))], 84 | sql=self.topic_sql, 85 | error_action= iot.CfnTopicRule.ActionProperty( 86 | cloudwatch_logs=iot.CfnTopicRule.CloudwatchLogsActionProperty( 87 | log_group_name=log_group.log_group_name, 88 | role_arn=iot_to_cloudwatch_logs_role.role_arn 89 | ) 90 | ))) 91 | topic_rule.node.add_dependency(timestream_database) 92 | topic_rule.node.add_dependency(iot_timestream_role) 93 | topic_rule.node.add_dependency(timestream_table) 94 | topic_rule.apply_removal_policy(policy=cdk.RemovalPolicy.DESTROY) 95 | 96 | 97 | def performInputValidation(self): 98 | self.validateSql(self.topic_sql) 99 | self.validateDimensionList(self.dimensions_list) 100 | if not self.timestream_db_name: 101 | self.timestream_db_name = "DemoTimestreamDB" 102 | else: 103 | self.validateTimestreamResourceName(self.timestream_db_name) 104 | if not self.timestream_table_name: 105 | self.timestream_db_name = "DemoTimestreamTable" 106 | else: 107 | self.validateTimestreamResourceName(self.timestream_table_name) 108 | self.validateIoTtoTimestreamRoleName(self.timestream_iot_role_name) 109 | self.validateIoTTpoicRuleName(self.timestream_iot_rule_name) 110 | 111 | def validateSql(self, sqlStatement): 112 | if not sqlStatement: 113 | raise NoSQL 114 | elif type(sqlStatement) != str: 115 | raise WrongFormattedInput("The input sql statement does not have a right format. Please refer to README.md for more information.") 116 | return 117 | 118 | def validateTimestreamResourceName(self, inputStr): 119 | if type(inputStr) != str: 120 | raise WrongFormattedInput("The provided input for Timestream resource name is not of type string.") 121 | else: 122 | checkInputLength(self, 3, 256, inputStr, "Timestream resource") 123 | checkInputPattern(self, r'^[a-zA-Z0-9-_\.]+$' , inputStr, "Timestream resource") 124 | 125 | def validateIoTTpoicRuleName(self, inputStr): 126 | if not inputStr: 127 | self.timestream_iot_rule_name = "DemoIoTtoTimestreamRule" 128 | elif type(inputStr) != str: 129 | raise WrongFormattedInput("The provided input for topic rule name is not of type string.") 130 | else: 131 | checkInputPattern(self, r'^[a-zA-Z0-9_]+$' , inputStr, "IoT rule") 132 | 133 | def validateIoTtoTimestreamRoleName(self, inputStr): 134 | if not inputStr: 135 | self.timestream_iot_role_name = "DemoIoTtoTimestreamRole" 136 | elif type(inputStr) != str: 137 | raise WrongFormattedInput("The provided input for the IAM role name is not of type string") 138 | else: 139 | checkInputLength(self, 1, 64, inputStr, "IAM role") 140 | checkInputPattern(self, r'^[a-zA-Z0-9+=,@-_\.]+$' , inputStr, "IAM role") 141 | 142 | def validateDimensionList(self, dimensinList): 143 | if not dimensinList: 144 | raise NoTimestreamDimension 145 | elif type(dimensinList) != list: 146 | raise WrongFormattedInput("The provided input for the dimesnion list is not of type list.") 147 | else: 148 | for d in dimensinList: 149 | if type(d) != str: 150 | raise WrongFormattedInput("At least one of the provided dimensions is not of type string.") 151 | return -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/common/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/cloud_templates/aws_cdk/common/__init__.py -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/common/customExceptions.py: -------------------------------------------------------------------------------- 1 | class NoSQL(Exception): 2 | 3 | def __init__(self): 4 | self.message = "No sql statemtnt is provided. Please refer to README.md for more information." 5 | 6 | def __str__(self): 7 | return(repr(self.message)) 8 | 9 | class NoTimestreamDimension(Exception): 10 | 11 | def __init__(self): 12 | self.message = "No dimesnsion is provided. Each record contains an array of dimensions (minimum 1).Please refer to README.md for more information." 13 | 14 | def __str__(self): 15 | return(repr(self.message)) 16 | 17 | class WrongLengthForInput(Exception): 18 | 19 | def __init__(self, message): 20 | self.message = message 21 | 22 | def __str__(self): 23 | return(repr(self.message)) 24 | 25 | class WrongFormattedInput(Exception): 26 | 27 | def __init__(self, message): 28 | self.message = message 29 | 30 | def __str__(self): 31 | return(repr(self.message)) -------------------------------------------------------------------------------- /cloud_templates/aws_cdk/common/inputValidation.py: -------------------------------------------------------------------------------- 1 | import re 2 | from common.customExceptions import * 3 | 4 | def checkInputLength(self, min_length, max_length, input, resource_name): 5 | if len(input) < min_length or len(input) > max_length: 6 | raise WrongLengthForInput(f"Invalid input length for {resource_name}'s name. Check the README.md file for more details.") 7 | 8 | def checkInputPattern(self, pattern, input, resource_name): 9 | if not re.match(pattern, input): 10 | raise WrongFormattedInput(f"Invalid input pattern for {resource_name}'s name. Check the README.md file for more details.") -------------------------------------------------------------------------------- /cloud_templates/demo/demo_weather_station_code/README.md: -------------------------------------------------------------------------------- 1 | # Running demo code with VSCode and PlatformIO guide 2 | 3 | This guide takes you through the steps to set up and use the provided demo code to send data from ExpressLink to the cloud using PlatformIO IDE. 4 | 5 | ## Setup and prerequisites 6 | 7 | This code uses PlatformIO as its platform. [PlatformIO](https://platformio.org/) is a professional collaborative platform for embedded development. To get started we should set up the PlatformIO IDE in Visual Studio Code. 8 | 9 | * If you haven’t already, [download](https://code.visualstudio.com/download) and [setup](https://code.visualstudio.com/docs/setup/setup-overview#setup-articles) Visual Studio Code. 10 | * Open VSCode **Package Manager**. 11 | * Search for the `PlatformIO IDE` extension. 12 | 13 |
14 |
alt text
15 |
16 | 17 | 18 | * Install `PlatformIO IDE`. 19 | * Click on “PlatformIO Home” button. 20 | 21 |
22 |
alt text
23 |
24 | 25 | 26 | * Click on **New Project** and select a board and create new PlatformIO Project. 27 | 28 |
29 |
alt text
30 |
31 | 32 | 33 | * Copy the main.cpp file of the demo code into **src/main.cpp** file of your new project. 34 | * In the *loop()* function, uncomment the line that will generate and send data to the topic you want to test. For instance, if you are running the demo with the Timestream template, uncomment the line that sends data to Timestream_demo topic. 35 | * **Build** and **Upload** the program. 36 | 37 |
38 |
alt text
39 |
40 | 41 | * Now from the Serial Monitor of the bottom toolbar, you can verify that your ExpressLink is connected and sending data to the cloud. 42 | * Visit the official documentation [PlatformIO IDE for VSCode](http://docs.platformio.org/page/ide/vscode.html) for more details and examples. 43 | 44 | 45 | -------------------------------------------------------------------------------- /cloud_templates/demo/demo_weather_station_code/main.cpp: -------------------------------------------------------------------------------- 1 | #include "Arduino.h" 2 | #include 3 | #include 4 | #include 5 | 6 | #define SerialA SerialUSB 7 | #define SerialB Serial1 8 | 9 | typedef enum response_codes 10 | { 11 | EL_OK, EL_OVERFLOW, EL_PARSE_ERROR, EL_COMMAND_NOT_FOUND, EL_PARAMETER_ERROR, 12 | EL_INVALID_ESCAPE, EL_NO_CONNECTION, EL_TOPIC_OUT_OF_RANGE, EL_TOPIC_UNDEFINED, 13 | EL_INVALID_KEY_LENGTH, EL_INVALID_KEY_NAME, EL_UNKNOWN_KEY, EL_KEY_READONLY, 14 | EL_KEY_WRITEONLY, EL_UNABLE_TO_CONNECT, EL_TIME_NOT_AVAILABLE, EL_LOCATION_NOT_AVAILABLE, 15 | EL_MODE_NOT_AVAILABLE, EL_ACTIVE_CONNECTION, EL_HOST_IMAGE_NOT_AVAILABLE, EL_INVALID_ADDRESS, 16 | EL_INVALID_OTA_UPDATE, EL_INVALID_QUERY, EL_INVALID_SIGNATURE 17 | }response_codes_t; 18 | 19 | String SendCommand(String command) 20 | { 21 | SerialB.print(command+"\n"); 22 | String response = SerialB.readString(); 23 | return response; 24 | } 25 | 26 | response_codes_t checkResponse(String response) 27 | { 28 | if(response.indexOf("OK")!= -1) return EL_OK; 29 | //int errPosition = response.indexOf("ERR"); 30 | response_codes_t errCode = (response_codes_t) response.substring(3).toInt(); 31 | return errCode; 32 | } 33 | 34 | void expressLinkConnect() 35 | { 36 | String response; 37 | bool finished = false; 38 | 39 | response = SendCommand("AT+CONNECT?"); 40 | if(response.indexOf("OK 1")==-1) 41 | { 42 | SerialA.println("Connecting ExpressLink"); 43 | do{ 44 | response = SendCommand("AT+CONNECT"); 45 | if(checkResponse(response) == EL_OK) 46 | { 47 | finished = true; 48 | } 49 | else 50 | { 51 | SerialA.println(response); 52 | } 53 | } while(!finished); 54 | SerialA.println("Connected to ExpressLink"); 55 | } 56 | } 57 | 58 | void generateAndSendData(int index){ 59 | // Payload components 60 | /* 61 | Temperature -> The measured temperature in degrees Fahrenheit. 62 | Humidity -> The measured relative humidity. 63 | Pressure -> The measured pressure in inches of Mercury or Hg. 64 | Solar_radiation/UV -> The measured UV shown as UV index. 65 | Wind direction -> The wind direction in degrees. 66 | Wind speed -> The measured windspeed in Miles per Hour. 67 | Location -> The state that the reporting station sends its data to. 68 | */ 69 | 70 | 71 | // Random value for temperature (between 40 to 70 degrees Fahrenheit) 72 | int temp = (rand() % 31) + 40; 73 | 74 | // Random value for pressure (between 29.6 to 30.2 inches Hg) 75 | float pressure = (float)(rand() % 61)/(float)100 + 29.6; 76 | 77 | // Random value for relative humidity (between 30 to 90) 78 | int humidity = (rand() % 61) + 30; 79 | 80 | // Random value for UV index (between 1 to 11) 81 | int UV = (rand() % 11) + 1; 82 | 83 | // Random value for wind speed (between 7 to 12) 84 | float windSpeed = (rand() % 6) + 7 + (float)(rand()%10)/(float)10; 85 | 86 | // Random value for wind direction (between 7 to 12) 87 | int windDir = rand() % 360; 88 | 89 | // Random value for location 90 | String states[] = {"Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming"}; 91 | String location = states[rand() % 50]; 92 | 93 | // sending the json payload 94 | 95 | if (index == 1) 96 | SerialB.print("AT+SEND1 {\"Temperature\":"); 97 | else if (index == 2) 98 | SerialB.print("AT+SEND2 {\"Temperature\":"); 99 | else if (index == 3) 100 | SerialB.print("AT+SEND3 {\"Temperature\":"); 101 | else if (index == 4) 102 | SerialB.print("AT+SEND4 {\"Temperature\":"); 103 | 104 | SerialB.print(temp); 105 | SerialB.print(",\"Pressure\":"); 106 | SerialB.print(pressure); 107 | SerialB.print(",\"Humidity\":"); 108 | SerialB.print(humidity); 109 | SerialB.print(",\"UV\":"); 110 | SerialB.print(UV); 111 | SerialB.print(",\"Wind_Speed\":"); 112 | SerialB.print(windSpeed); 113 | SerialB.print(",\"Wind_Direction\":"); 114 | SerialB.print(windDir); 115 | SerialB.print(",\"Location\":"); 116 | SerialB.print("\""+String(location)+ "\""); 117 | SerialB.println("}"); 118 | } 119 | 120 | void setup() { 121 | 122 | SerialA.begin(115200); 123 | SerialB.begin(115200); 124 | 125 | while(!SerialA && !SerialB); 126 | 127 | SendCommand("AT+CONF Topic1=Timestream_demo"); 128 | SendCommand("AT+CONF Topic2=Opensearch_demo"); 129 | SendCommand("AT+CONF Topic3=IoT_Analytics_demo"); 130 | SendCommand("AT+CONF Topic4=Kinesis_demo"); 131 | 132 | expressLinkConnect(); 133 | } 134 | 135 | void loop() { 136 | 137 | // Uncomment the line below to send data under "Timestream" topic to test the Timestream template 138 | //generateAndSendData(1); 139 | 140 | // Uncomment the line below to send data under "OpenSearch" topic to test the OpenSearch template 141 | // generateAndSendData(2); 142 | 143 | // Uncomment the line below to send data under "IoT Analytics" topic to test the IoT Analytics template 144 | // generateAndSendData(3); 145 | 146 | // Uncomment the line below to send data under "Kinesis" topic to test the Kinesis template 147 | // generateAndSendData(4); 148 | 149 | // send data every minute 150 | delay(60000); 151 | } 152 | 153 | -------------------------------------------------------------------------------- /cloud_templates/user_guides/images/iotanalytics_structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/cloud_templates/user_guides/images/iotanalytics_structure.png -------------------------------------------------------------------------------- /cloud_templates/user_guides/images/kinesis_structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/cloud_templates/user_guides/images/kinesis_structure.png -------------------------------------------------------------------------------- /cloud_templates/user_guides/images/opensearch_structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/cloud_templates/user_guides/images/opensearch_structure.png -------------------------------------------------------------------------------- /cloud_templates/user_guides/images/timestream_structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/cloud_templates/user_guides/images/timestream_structure.png -------------------------------------------------------------------------------- /examples/Arduino/README.md: -------------------------------------------------------------------------------- 1 | ## Arduino Examples 2 | 3 | These examples are on the common Arduino platform. 4 | -------------------------------------------------------------------------------- /examples/Arduino/SerialPassthrough/README.md: -------------------------------------------------------------------------------- 1 | ## Serial Passthrough 2 | 3 | This example is simply a way to pass commands through an SparkFun RedBoard Turbo Arduino host board to the ExpressLink. This makes manually interacting with the ExpressLink attached to an Arduino host very simple. Use this sketch to explore the commands and perform one-time configurations such as the SSID/Passphrase for WiFi. 4 | 5 | Instructions on how to set up the RedBoard Turbo in Arduino IDE can be found [here](https://learn.sparkfun.com/tutorials/redboard-turbo-hookup-guide). 6 | -------------------------------------------------------------------------------- /examples/Arduino/SerialPassthrough/SerialPassthrough.ino: -------------------------------------------------------------------------------- 1 | /* 2 | SerialPassthrough for ExpressLink 3 | 4 | Based upon the buildin passthrough example 5 | https://www.arduino.cc/en/Tutorial/BuiltInExamples/SerialPassthrough 6 | */ 7 | 8 | #define SerialA SerialUSB 9 | #define SerialB Serial1 10 | 11 | void setup() { 12 | SerialA.begin(115200); 13 | SerialB.begin(115200); 14 | 15 | while(!SerialA && !SerialB); 16 | } 17 | 18 | void loop() { 19 | if (SerialA.available()) { // If anything comes in Serial (USB), 20 | SerialB.write(SerialA.read()); // read it and send it out Serial1 (pins 0 & 1) 21 | } 22 | 23 | if (SerialB.available()) { // If anything comes in Serial1 (pins 0 & 1) 24 | SerialA.write(SerialB.read()); // read it and send it out Serial (USB) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /examples/Arduino/expressLink_temperature/README.md: -------------------------------------------------------------------------------- 1 | ## ExpressLink temperature 2 | 3 | Use a ExpressLink, a SparkFun Redboard Turbo and a SparkFun QWICC TMP102 temperature sensor to collect temperature data and report it to AWS IoT. 4 | 5 | -------------------------------------------------------------------------------- /examples/Arduino/expressLink_temperature/expressLink_temperature.ino: -------------------------------------------------------------------------------- 1 | 2 | 3 | #include 4 | #include 5 | 6 | TMP102 sensor0; 7 | 8 | #define HIGH_TEMPERATURE 28.0 9 | #define LOW_TEMPERATURE 26.0 10 | const int SamplePeriod_ms = 5000; 11 | 12 | // Helpers for ExpressLink command processing 13 | 14 | typedef enum response_codes 15 | { 16 | EL_OK, EL_OVERFLOW, EL_PARSE_ERROR, EL_COMMAND_NOT_FOUND, EL_PARAMETER_ERROR, 17 | EL_INVALID_ESCAPE, EL_NO_CONNECTION, EL_TOPIC_OUT_OF_RANGE, EL_TOPIC_UNDEFINED, 18 | EL_INVALID_KEY_LENGTH, EL_INVALID_KEY_NAME, EL_UNKNOWN_KEY, EL_KEY_READONLY, 19 | EL_KEY_WRITEONLY, EL_UNABLE_TO_CONNECT, EL_TIME_NOT_AVAILABLE, EL_LOCATION_NOT_AVAILABLE, 20 | EL_MODE_NOT_AVAILABLE, EL_ACTIVE_CONNECTION, EL_HOST_IMAGE_NOT_AVAILABLE, EL_INVALID_ADDRESS, 21 | EL_INVALID_OTA_UPDATE, EL_INVALID_QUERY, EL_INVALID_SIGNATURE 22 | }response_codes_t; 23 | 24 | typedef enum alarm_s 25 | { 26 | AL_NONE, AL_HIGH, AL_LOW, AL_OK 27 | } alarm_t; 28 | const char *alarmStrings[] = {"", "HIGH", "LOW","OK" }; 29 | 30 | #define expresslink_com Serial1 31 | 32 | // Send a command and retrieve the response 33 | String SendCommand(String command) 34 | { 35 | expresslink_com.print(command+"\n"); 36 | String response = expresslink_com.readString(); 37 | return response; 38 | } 39 | 40 | // Get the response code from the begining of an ExpressLink response 41 | response_codes_t checkResponse(String response) 42 | { 43 | if(response.indexOf("OK")!= -1) return EL_OK; 44 | int errPosition = response.indexOf("ERR"); 45 | response_codes_t errCode = (response_codes_t) response.substring(3).toInt(); 46 | return errCode; 47 | } 48 | 49 | void expressLinkConnect() 50 | { 51 | String response; 52 | bool finished = false; 53 | 54 | response = SendCommand("AT+CONNECT?"); 55 | if(response.indexOf("OK 1")==-1) 56 | { 57 | SerialUSB.println("Connecting ExpressLink"); 58 | do{ 59 | response = SendCommand("AT+CONNECT"); 60 | if(checkResponse(response) == EL_OK) 61 | { 62 | finished = true; 63 | } 64 | else 65 | { 66 | SerialUSB.println(response); 67 | } 68 | }while(!finished); 69 | SerialUSB.println("Connected to ExpressLink"); 70 | } 71 | } 72 | 73 | // application 74 | 75 | void setup() { 76 | delay(500); 77 | SerialUSB.begin(115200); 78 | while (!SerialUSB); 79 | 80 | Wire.begin(); 81 | 82 | SerialUSB.println("checking the connection"); 83 | 84 | if(!sensor0.begin()) 85 | { 86 | SerialUSB.println("Cannot connect to TMP102."); 87 | SerialUSB.println("Check your connections."); 88 | while(1); 89 | } 90 | 91 | SerialUSB.println("Connected to TMP102!"); 92 | 93 | expresslink_com.begin(115200); 94 | 95 | SendCommand("AT+CONF Topic1=temperature"); 96 | SendCommand("AT+CONF Topic2=alarm"); 97 | 98 | expressLinkConnect(); 99 | 100 | } 101 | 102 | float collectData() 103 | { 104 | sensor0.wakeup(); 105 | float temperature = sensor0.readTempC(); 106 | sensor0.sleep(); 107 | return temperature; 108 | } 109 | 110 | alarm_t checkAlarm(float data, float high_limit, float low_limit) 111 | { 112 | static alarm_t alarm_pv = AL_NONE; 113 | alarm_t alarm_value = AL_NONE; 114 | 115 | if(data > high_limit) 116 | { 117 | alarm_value = AL_HIGH; 118 | } 119 | else if(data < low_limit) 120 | { 121 | alarm_value = AL_LOW; 122 | } 123 | else if(alarm_pv != AL_NONE) 124 | { 125 | alarm_value = AL_OK; 126 | } 127 | alarm_pv = alarm_value; 128 | return alarm_value; 129 | } 130 | 131 | void loop() { 132 | 133 | static int lastSampleTime_ms = 0; 134 | static bool alert_pv = false; 135 | String alarmString = ""; 136 | alarm_t alarm; 137 | int now = millis(); 138 | 139 | if( (now - SamplePeriod_ms) >= lastSampleTime_ms) 140 | { 141 | lastSampleTime_ms = now; 142 | 143 | expressLinkConnect(); // ensure we are still connected to the cloud 144 | 145 | float temperature = collectData(); 146 | alarm = checkAlarm(temperature, HIGH_TEMPERATURE, LOW_TEMPERATURE); 147 | 148 | SendCommand("AT+SEND1 "+String(temperature)); 149 | if(alarm != AL_NONE) 150 | { 151 | SendCommand("AT+SEND2 {\"alarm\":\"" + String(alarmStrings[alarm]) + "\"}"); 152 | alarmString = " - alarm : " + String(alarmStrings[alarm]); 153 | } 154 | 155 | SerialUSB.println("Temperature : " + String(temperature) + alarmString); 156 | } 157 | } 158 | -------------------------------------------------------------------------------- /examples/Arduino/grafana_demo/expresslink.h: -------------------------------------------------------------------------------- 1 | 2 | #pragma once 3 | 4 | class expresslink{ 5 | HardwareSerial& _port; 6 | const int _wake; 7 | const int _event; 8 | const int _reset; 9 | bool _connected; 10 | 11 | void _doReset(); 12 | 13 | public: 14 | expresslink(int wake, int event, int reset, HardwareSerial &port):_port(port), _wake(wake), _event(event), _reset(reset), _connected(false) {}; 15 | ~expresslink(){}; 16 | bool connect(); 17 | void begin(); 18 | String sendCommand(String); 19 | int checkResponse(String); 20 | }; 21 | -------------------------------------------------------------------------------- /examples/Arduino/grafana_demo/expresslink.ino: -------------------------------------------------------------------------------- 1 | #include "expresslink.h" 2 | 3 | void expresslink::_doReset(void) 4 | { 5 | digitalWrite(_reset,LOW); 6 | delay(10); 7 | digitalWrite(_reset,HIGH); 8 | delay(500); 9 | } 10 | 11 | void expresslink::begin(void) 12 | { 13 | pinMode(_wake,OUTPUT); 14 | digitalWrite(_wake, LOW); 15 | pinMode(_reset, OUTPUT); 16 | digitalWrite(_reset, HIGH); 17 | pinMode(_event,INPUT); 18 | 19 | _port.begin(115200); 20 | _port.setTimeout(30000); // set the timeout longer than the longest command. (30 seconds in the spec) 21 | _connected = false; 22 | delay(100); 23 | } 24 | 25 | String expresslink::sendCommand(String command) 26 | { 27 | _port.println(command); 28 | String response = _port.readStringUntil('\n'); 29 | if(response.length() == 0) 30 | { 31 | _doReset(); 32 | } 33 | return response; 34 | } 35 | 36 | int expresslink::checkResponse(String response) 37 | { 38 | if(response.indexOf("OK")!= -1) return 0; 39 | return response.substring(3).toInt(); 40 | } 41 | 42 | bool expresslink::connect() 43 | { 44 | String response; 45 | 46 | response = sendCommand("AT+CONNECT?"); 47 | int i = response.indexOf("OK 1"); 48 | if(i==-1) 49 | { 50 | _connected = false; 51 | response = sendCommand("AT+CONNECT"); 52 | if(checkResponse(response) == 0) 53 | { 54 | _connected = true; 55 | } 56 | } 57 | else 58 | { 59 | _connected = true; 60 | } 61 | return _connected; 62 | } 63 | -------------------------------------------------------------------------------- /examples/Arduino/grafana_demo/grafana_demo.ino: -------------------------------------------------------------------------------- 1 | /** 2 | * Report the temperature to the topic /dt/sensor/ so AWS timestream can catch the data. 3 | * Note, the topic is simply the one I specified for the timestream injest rule. 4 | * The JSON report includes the dimensions of 'device_id' and 'room' so that timestream queries can filter the data. 5 | * 6 | * Special Note about using the Redboard Turbo (or any SAMD21 based arduino) The main loop executes as follows: 7 | * while(1) 8 | * { 9 | * loop(); 10 | * Update the USB Serial port() 11 | * } 12 | * So if you use an infinite loop or otherwise prevent loop from "looping" then the serial port will freeze and possibly be dropped from your PC. 13 | * 14 | * 15 | * Prerequisites: 16 | * Make sure your ExpressLink is registered in your account. i.e. make a thing with the thingname/certificate from your expresslink and 17 | * set the expresslink endpoint to match your account. Follow the getting started guide from your ExpressLink to set this up. 18 | * 19 | */ 20 | 21 | #include 22 | #include // Used to establied serial communication on the I2C bus 23 | #include // Used to send and recieve specific information from our sensor 24 | #include 25 | #include "expresslink.h" 26 | 27 | TMP102 sensor0; 28 | SGP30 sensor1; 29 | 30 | #define Serial SerialUSB 31 | 32 | #define REPORT_INTERVAL_MS 5000 33 | #define AIR_QUALITY_MEASUREMENT_INTERVAL_MS 1000 34 | 35 | String thingname = "no_thingname"; 36 | 37 | expresslink el(3,2,4, Serial1); 38 | 39 | void setup() { 40 | Serial.begin(115200); 41 | Wire.begin(); 42 | sensor0.begin(); 43 | sensor1.begin(); 44 | 45 | el.begin(); 46 | String response = el.sendCommand("AT+CONF? ThingName"); 47 | if(el.checkResponse(response) == 0) 48 | { 49 | thingname = response.substring(3); 50 | Serial.println("Found thingname : "+thingname); 51 | el.sendCommand("AT+CONF Topic1=/dt/sensor/" + thingname); 52 | } 53 | else 54 | { 55 | Serial.println("Reading the thingname failed"); 56 | } 57 | sensor1.initAirQuality(); 58 | } 59 | 60 | void loop() 61 | { 62 | unsigned long now = millis(); 63 | static unsigned long previousReport = 0; 64 | static unsigned long previousMeasurement = 0; 65 | 66 | if( ( now - previousMeasurement ) > AIR_QUALITY_MEASUREMENT_INTERVAL_MS ) 67 | { 68 | previousMeasurement = now; 69 | sensor1.measureAirQuality(); // this function must be called every second 70 | } 71 | 72 | if( ( now - previousReport ) > REPORT_INTERVAL_MS ) 73 | { 74 | previousReport = now; 75 | sensor0.wakeup(); 76 | float temperature = sensor0.readTempC(); 77 | sensor0.sleep(); 78 | 79 | JSONVar dataReport; 80 | 81 | dataReport["room"] = "Tucson office"; 82 | dataReport["device_id"] = thingname; 83 | dataReport["temperature"] = temperature; 84 | dataReport["voc"] = sensor1.TVOC; 85 | dataReport["co2"] = sensor1.CO2; 86 | 87 | if( el.connect() ) 88 | { 89 | String command = "AT+SEND1 " + JSON.stringify(dataReport); 90 | String response = el.sendCommand(command); 91 | if(el.checkResponse(response) == 0) 92 | { 93 | Serial.println("reported : " + String(temperature,4)); 94 | } 95 | else 96 | { 97 | Serial.println("Report Failed"); 98 | } 99 | } 100 | else 101 | { 102 | Serial.println("No Connection"); 103 | } 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /examples/__pycache__/weather_station.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/examples/__pycache__/weather_station.cpython-39.pyc -------------------------------------------------------------------------------- /examples/python/sara_example/__pycache__/expresslink.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/examples/python/sara_example/__pycache__/expresslink.cpython-39.pyc -------------------------------------------------------------------------------- /examples/python/sara_example/__pycache__/weather_station.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/examples/python/sara_example/__pycache__/weather_station.cpython-39.pyc -------------------------------------------------------------------------------- /examples/python/sara_example/code.py: -------------------------------------------------------------------------------- 1 | import json 2 | import time 3 | import board 4 | import adafruit_bme680 5 | import busio 6 | from countio import Counter, Edge 7 | from digitalio import DigitalInOut, Direction, Pull 8 | from analogio import AnalogIn 9 | from weather_station import weather_station 10 | 11 | from expresslink import ExpressLink 12 | 13 | time.sleep(2) 14 | print("WeatherStation Startup") 15 | 16 | def celsius2fahrenheit(celsius:float)->float: 17 | return ((celsius * 9.0)/5.0) + 32.0 18 | 19 | def GetVoltage(pin): 20 | return (pin.value * 3.3) / 65536 21 | 22 | # Resistor table 23 | resistorTable = ((0,33000), (22.5,6570), (45,8200), (67.5,891), (90,1000), (112.5,688), (135,2200),(157.5,1410),(180,3900),(202.5,3140),(225,16000),(247.5, 14120),(270,120000),(292.5,42120),(315,64900), (337.5, 21880)) 24 | 25 | # Compute correct Resistance 26 | # Top resistor 10k 27 | # Supply voltage is 3.3v 28 | # R = (v * 10000)/(3.3-v) 29 | 30 | def getDirection(pin)->float: 31 | v = GetVoltage(pin) 32 | r = (v * 10000.0) / (3.3 - v) 33 | smallestValue = 10000000 34 | direction = 0.0 35 | for entry in resistorTable: 36 | distance = abs(r - entry[1]) 37 | if distance < smallestValue: 38 | direction = entry[0] 39 | smallestValue = distance 40 | return direction 41 | 42 | lastTime = time.time() 43 | def getSpeed(pin:Counter)->float: 44 | global lastTime 45 | thisTime = time.time() 46 | deltaTime = thisTime - lastTime 47 | windSpeed = pin.count / deltaTime 48 | pin.reset() 49 | lastTime = thisTime 50 | windSpeed *= 1.492 51 | return windSpeed # return wind speed in mph 52 | 53 | # todo: fix rain reset for 24 hours. use absolute time from expreslink 54 | lastTip = time.time() 55 | previousTipCount = 0 56 | def getRainDepth(pin:Counter)->float: 57 | global lastTip, previousTipCount 58 | now = time.time() 59 | tips = pin.count 60 | if previousTipCount != tips: 61 | lastTip = now 62 | previousTipCount = tips 63 | else: 64 | if now - lastTip > (24*3600): # if there are no tips for 24 hours, 65 | pin.reset() # reset the count 66 | previousTipCount = 0 67 | tips = 0 68 | return ( tips * 0.2794 ) / 25.4 # depth in in 69 | 70 | ws = weather_station() 71 | 72 | windDirection = AnalogIn(board.A0) 73 | 74 | uart = busio.UART(board.UART_TX1, board.UART_RX1, baudrate=115200, timeout=30) 75 | el = ExpressLink(uart, DigitalInOut(board.G5), DigitalInOut(board.G2), DigitalInOut(board.G6) ) 76 | 77 | el.begin() 78 | 79 | print("ExpressLink Started") 80 | 81 | led = DigitalInOut(board.G10) 82 | led.direction = Direction.OUTPUT 83 | 84 | 85 | i2c = board.I2C() 86 | bme680 = adafruit_bme680.Adafruit_BME680_I2C(i2c,debug=False) 87 | 88 | temperature_offset=-5 89 | 90 | rain = Counter(board.D1, edge=Edge.FALL, pull=Pull.UP) 91 | rain.reset() 92 | wind = Counter(board.PWM0, edge=Edge.FALL, pull=Pull.UP) 93 | wind.reset() 94 | 95 | response = el.sendCommand('AT+CONF? ThingName') 96 | thingName = response[3:] 97 | response = el.sendCommand("AT+CONF Topic1=/weather/sensor/" + thingName) 98 | 99 | reportCounter = 60 100 | while True: 101 | led.value = True 102 | reportCounter -= 1 103 | 104 | ws.addWind(getSpeed(wind), getDirection(windDirection)) 105 | 106 | if reportCounter == 0: 107 | if el.connect() and reportCounter == 0: 108 | reportCounter = 60 109 | report = {} 110 | report["tempf"] = celsius2fahrenheit( bme680.temperature+temperature_offset ) 111 | report["humidity"] = bme680.relative_humidity 112 | report["pressure"] = bme680.pressure 113 | report["winddir"] = ws.windDirection 114 | report["windspeedmph"] = ws.windSpeed 115 | report["windgustmph"] = ws.windGust1minSpeed 116 | report["windgustdir"] = ws.windGust1minDirection 117 | report["windspdmph_avg2m"] = ws.wind2MinAverageMPH 118 | report["winddir_avg2m"] = ws.wind2MinAverageDirection 119 | report["windgustmph_10m"] = ws.wind10MinGustMPH 120 | report["windgustdir_10m"] = ws.wind10MinGustDirection 121 | report["dailyrainin"] = getRainDepth(rain) 122 | data = json.dumps(report) 123 | print("Reporting : " + data) 124 | el.sendCommand("AT+SEND1 " + data) 125 | else: 126 | reportCounter = 2 # try again in 2 seconds 127 | print("No connection") 128 | 129 | # ensure the LED blink is noticable 130 | time.sleep(.5) 131 | led.value = False 132 | time.sleep(.5) -------------------------------------------------------------------------------- /examples/python/sara_example/expresslink.py: -------------------------------------------------------------------------------- 1 | import busio 2 | import time 3 | from digitalio import DigitalInOut, Direction, Pull 4 | 5 | class ExpressLink: 6 | event_pin:DigitalInOut # change to be an input pin with a callback 7 | powerOn_pin:DigitalInOut 8 | powerCheck_pin:DigitalInOut 9 | _connected:bool 10 | port:serial 11 | 12 | def __init__(self, port, event, powerOn, powerCheck): 13 | self.port = port 14 | self.event_pin = event 15 | self.powerOn_pin = powerOn 16 | self.powerCheck_pin = powerCheck 17 | self.event_pin.direction = Direction.INPUT 18 | self.powerCheck_pin.direction = Direction.INPUT 19 | self.powerOn_pin.direction = Direction.OUTPUT 20 | self.powerOn_pin.value = False 21 | 22 | # This function relies upon the SARA_ON signal to work 23 | def _powerOn(self)->bool: 24 | while self.powerCheck_pin.value == True: 25 | self.powerOn_pin.value = True 26 | time.sleep(.50) 27 | self.powerOn_pin.value = False 28 | time.sleep(.1) 29 | print("ExpressLink Powered") 30 | return True 31 | 32 | def _comCheck(self)->bool: 33 | print("Checking Communications") 34 | response = "" 35 | while response.find("OK") != 0: 36 | time.sleep(.5) 37 | response = self.sendCommand("AT") 38 | return True 39 | 40 | def begin(self): 41 | self._connected = False 42 | self._powerOn() 43 | self._comCheck() 44 | print("ExpressLink Up") 45 | 46 | def connect(self)->bool: 47 | response = self.sendCommand("AT+CONNECT?") 48 | print("connect_check : " + response) 49 | code = response.find("OK 1") 50 | if code == -1: 51 | self._connected = False 52 | response = self.sendCommand("AT+CONNECT") 53 | print("connect:"+response) 54 | if self.checkResponse(response) == 0: 55 | self._connected = True 56 | else: 57 | self._connected = True 58 | return self._connected 59 | 60 | def sendCommand(self, command:str)->str: 61 | command += '\n' 62 | self.port.write(command.encode("utf-8")) 63 | time.sleep(1) 64 | response = self.port.readline() 65 | if response != None: 66 | return response.decode("utf-8") 67 | else: 68 | return "" 69 | 70 | def checkResponse(self, response:str)->int: 71 | if response.find("OK") == 0: 72 | return 0 73 | else: 74 | if response.find("ERR") == 0: 75 | return int(response[3:]) 76 | else: 77 | return -1 78 | 79 | -------------------------------------------------------------------------------- /examples/python/sara_example/readme.md: -------------------------------------------------------------------------------- 1 | # U-Blox SARA R5 ExpressLink CircuitPython Demo 2 | 3 | # ExpressLink Configuration 4 | Execute manual steps in the expresslink getting started guide to get the Ublox ExpressLink connected to your AWS account. 5 | 6 | # HW Configuration 7 | The SARA R5 ExpressLink board must be configured to enable the power state feedback. This signal is labeled SARA_ON on the schematic. 8 | On the back of the board, you must apply a solder blob to the two pads labeled SARA_ON to connect that signal to G6 on the micromod. 9 | 10 | The tipping bucket is connected to signal D1 on the right side of the expresslink board. 11 | The wind speed is connected to signal PWM0 on the right side of the expresslink board. 12 | The wind direction is connected to signal A1 on the right side of the expresslink board. 13 | The wind direction is also connected to 3.3v via a 10k resistor. I was able to bridge A1 to the QWICC 3v3 pin with a surface mount resistor and a bit of wire. 14 | 15 | Attach the QWICC BME680 cable between the BME680 and the ExpressLink bkard. 16 | 17 | # SW Configuration 18 | Install the CircuitPython image from this location: https://circuitpython.org/board/sparkfun_micromod_rp2040/ 19 | 20 | Install the BME680 CircuitPython library from this location: https://github.com/adafruit/Adafruit_CircuitPython_BME680 21 | The BME680 library can be simply copied into the LIB folder present on the CIRCUITPY filesystem after the CircuitPython image is installed. 22 | Connect a USB cable to the board and open a terminal. 115200 8N1 23 | copy expresslink.py and code.py into the CIRCUITPY filesystem and watch the data. 24 | 25 | -------------------------------------------------------------------------------- /examples/python/sara_example/station_test.py: -------------------------------------------------------------------------------- 1 | from weather_station import weather_station 2 | import random 3 | import time 4 | 5 | direction = [ 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 6 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 7 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 8 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 9 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 10 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 11 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 12 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 13 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 14 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 15 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 16 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 17 | 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 18 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 19 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 20 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 21 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 22 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 23 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 24 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 25 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 26 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 27 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 28 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 29 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 30 | 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 32 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 33 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 34 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 35 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 36 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 37 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 38 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 39 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 40 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 41 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 42 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 43 | 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 44 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 45 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 46 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 47 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 48 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 49 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 50 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 51 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 52 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 53 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 54 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 55 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 56 | 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 57 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 58 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 59 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 60 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 61 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 62 | 350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0,350.0, 63 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 64 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 65 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 66 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 67 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 68 | 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 69 | 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 70 | ] 71 | 72 | ws= weather_station() 73 | 74 | for d in direction: 75 | ws.addWind( random.random() * 50.0, d ) 76 | 77 | print("gust speed " + str(ws.windGust1minSpeed)) 78 | print("gust direction " + str(ws.windGust1minDirection)) 79 | print("10 min gust speed " + str(ws.wind10MinGustMPH)) 80 | print("10 min gust direction " + str(ws.wind10MinGustDirection)) 81 | -------------------------------------------------------------------------------- /examples/python/sara_example/weather_station.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | class weather_station: 4 | windGust1minSpeed:float 5 | windGust1minDirection:float 6 | windDataSpeed = [] 7 | windDataDirection = [] 8 | windGust = [] 9 | gustDataCounter:int 10 | windDataCounter:int 11 | 12 | # report this information 13 | windSpeed:float 14 | windDirection:float 15 | wind2MinAverageMPH:float 16 | wind2MinAverageDirection:float 17 | wind10MinGustMPH:float 18 | wind10MinGustDirection:float 19 | 20 | def __init__(self): 21 | print("starting weather station") 22 | self.windGust1minSpeed = 0.0 23 | self.gustDataCounter = 60 24 | self.windDataCounter = 120 25 | self.windGust1minDirection = 0.0 26 | self.windGust1minSpeed = 0.0 27 | self.wind2MinAverageMPH = 0.0 28 | self.wind2MinAverageDirection = 0.0 29 | self.wind10MinGustDirection = 0.0 30 | self.wind10MinGustMPH = 0.0 31 | self.windSpeed = 0.0 32 | self.windDirection = 0.0 33 | 34 | # run every 1 minute assumes it is called every second 35 | def _doGusts(self, speed: float, direction:float): 36 | self.gustDataCounter -= 1 37 | if speed > self.windGust1minSpeed: 38 | self.windGust1minSpeed = speed 39 | self.windGust1minDirection = direction 40 | 41 | if self.gustDataCounter == 0: 42 | self.gustDataCounter = 60 43 | # update the 10 minute wind gust statistics every minute 44 | gdata = (self.windGust1minSpeed, self.windGust1minDirection) 45 | self.windGust.append( gdata ) 46 | self.windGust1minSpeed = 0 47 | while len(self.windGust) > 10: # ensure we only have 10 minutes of data 48 | self.windGust.pop(0) 49 | gust = (0.0,0.0) 50 | for g in self.windGust: 51 | if g[0] > gust[0]: 52 | gust = g 53 | self.wind10MinGustMPH = gust[0] 54 | self.wind10MinGustDirection = gust[1] 55 | 56 | def addWind(self, speed: float , direction:float): 57 | self.windDataCounter -= 1 58 | self.windSpeed = speed 59 | self.windDirection = direction 60 | self.windDataSpeed.append( speed ) 61 | self.windDataDirection.append( direction ) 62 | 63 | self._doGusts(speed,direction) 64 | 65 | if self.windDataCounter == 0: 66 | self.windDataCounter = 120 67 | # time to compute wind statistics (every 2 minutes) 68 | self._calcWeather() 69 | self.windDataDirection.clear() 70 | self.windDataSpeed.clear() 71 | 72 | def _addDirection(self, direction1:float, direction2:float )->float: 73 | delta = direction1 - direction2 74 | if delta < -180.0: 75 | return delta + 360 76 | elif delta > 180.0: 77 | return delta - 360 78 | else: 79 | return delta 80 | 81 | def _calcWeather(self): 82 | speedAverage = 0 83 | for w in self.windDataSpeed: 84 | speedAverage += w 85 | self.wind2MinAverageMPH = speedAverage / len(self.windDataSpeed) 86 | 87 | sum = self.windDataDirection[0] 88 | D = self.windDataDirection[0] 89 | for d in self.windDataDirection[1:]: 90 | D += self._addDirection(d, D) 91 | sum += D 92 | self.wind2MinAverageDirection = sum / len(self.windDataDirection) 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/.gitignore: -------------------------------------------------------------------------------- 1 | # For PCBs designed using KiCad: http://www.kicad-pcb.org/ 2 | # Format documentation: http://kicad-pcb.org/help/file-formats/ 3 | 4 | # Temporary files 5 | *.000 6 | *.bak 7 | *.bck 8 | *.kicad_pcb-bak 9 | *.kicad_sch-bak 10 | *.kicad_pro-bak 11 | *.kicad_prl 12 | *.sch-bak 13 | *~ 14 | _autosave-* 15 | *.tmp 16 | *-save.pro 17 | *-save.kicad_pcb 18 | fp-info-cache 19 | *-backups/ 20 | \#auto_saved_files# 21 | 22 | # Netlist files (exported from Eeschema) 23 | *.net 24 | 25 | # Autorouter files (exported from Pcbnew) 26 | *.dsn 27 | *.ses 28 | 29 | ###### 30 | 31 | Generated/ 32 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/README.md: -------------------------------------------------------------------------------- 1 | # AWS IoT ExpressLink Demo Badge 2 | 3 | This device was designed and created for the [AWS IoT ExpressLink Demo Badge Workshop](https://catalog.workshops.aws/aws-iot-expresslink-demo-badge/), which was run at re:Invent 2022. 4 | 5 | The Demo Badge features an RP2040 microcontroller, an Espressif ESP32-C3-MINI-1-A AWS IoT ExpressLink module, various sensors, buttons, RGB LEDs, and a color display. 6 | 7 | You can find more information about the device itself, and its components, as part of the [workshop appendix](https://catalog.workshops.aws/aws-iot-expresslink-demo-badge/en-US/7-appendix). 8 | 9 | ![AWS IoT ExpressLink Demo Badge frontside and backside of fully assembled device](demo-badge.png) 10 | 11 | ## Schematic 12 | 13 | The schematic for the Demo Badge is available as KiCAD 6 project. You can access a [PDF version of the single-sheet schematic here](./snapshot/Schematic/aws-iot-expresslink-demo-badge-schematic.pdf). 14 | 15 | ## PCB Layout 16 | 17 | The PCB layout for the Demo Badge is available as KiCAD 6 project, including all footprints (publicly available ones, and custom ones). 18 | 19 | You can access the [production Gerber files here](./snapshot/Manufacturers/JLCPCB/). 20 | 21 | ## Re-generate Gerbers and other files 22 | 23 | If you made any changes to the PCB layout, you have to re-generate the Gerbers files before sending them to your PCB manufacturer. You can use [KiBot](https://github.com/INTI-CMNB/KiBot) to generate Gerbers and other files in a repeatable way using the `kibot.yaml` configuration file. 24 | 25 | You can follow the KiBot installation guide, or use a Docker container: 26 | 27 | ```bash 28 | docker run --rm -v "$PWD":/kicad -w /kicad setsoft/kicad_auto:ki6 kibot -c kibot.yaml 29 | ``` 30 | 31 | All KiBot-generated files are available under `Generated/`. 32 | 33 | ## License 34 | 35 | This hardware design is licensed under the MIT-0 License. Imported footprints and 3D models might contain different licenses. 36 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/components/ALS-PT19-315C_L177_TR8/ALS-PT19-315C_L177_TR8.kicad_sym: -------------------------------------------------------------------------------- 1 | (kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor) 2 | (symbol "ALS-PT19-315C{slash}L177{slash}TR8" (pin_numbers hide) (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes) 3 | (property "Reference" "A" (id 0) (at -10.16 5.08 0) 4 | (effects (font (size 1.27 1.27)) (justify left bottom)) 5 | ) 6 | (property "Value" "ALS-PT19-315C{slash}L177{slash}TR8" (id 1) (at -10.16 -7.62 0) 7 | (effects (font (size 1.27 1.27)) (justify left bottom)) 8 | ) 9 | (property "Footprint" "XDCR_ALS-PT19-315C/L177/TR8" (id 2) (at 0 0 0) 10 | (effects (font (size 1.27 1.27)) (justify left bottom) hide) 11 | ) 12 | (property "Datasheet" "" (id 3) (at 0 0 0) 13 | (effects (font (size 1.27 1.27)) (justify left bottom) hide) 14 | ) 15 | (property "STANDARD" "Manufacturer Recommendations" (id 4) (at 0 0 0) 16 | (effects (font (size 1.27 1.27)) (justify left bottom) hide) 17 | ) 18 | (property "MAXIMUM_PACKAGE_HEIGHT" "0.7 mm" (id 5) (at 0 0 0) 19 | (effects (font (size 1.27 1.27)) (justify left bottom) hide) 20 | ) 21 | (property "MANUFACTURER" "Everlight" (id 6) (at 0 0 0) 22 | (effects (font (size 1.27 1.27)) (justify left bottom) hide) 23 | ) 24 | (property "PARTREV" "5" (id 7) (at 0 0 0) 25 | (effects (font (size 1.27 1.27)) (justify left bottom) hide) 26 | ) 27 | (property "ki_locked" "" (id 8) (at 0 0 0) 28 | (effects (font (size 1.27 1.27))) 29 | ) 30 | (symbol "ALS-PT19-315C{slash}L177{slash}TR8_0_0" 31 | (polyline 32 | (pts 33 | (xy -4.953 0.635) 34 | (xy -3.175 -1.143) 35 | ) 36 | (stroke (width 0.1524) (type default) (color 0 0 0 0)) 37 | (fill (type none)) 38 | ) 39 | (polyline 40 | (pts 41 | (xy -4.953 2.54) 42 | (xy -3.175 0.762) 43 | ) 44 | (stroke (width 0.1524) (type default) (color 0 0 0 0)) 45 | (fill (type none)) 46 | ) 47 | (polyline 48 | (pts 49 | (xy -4.318 -0.762) 50 | (xy -3.556 0) 51 | ) 52 | (stroke (width 0.1524) (type default) (color 0 0 0 0)) 53 | (fill (type none)) 54 | ) 55 | (polyline 56 | (pts 57 | (xy -4.318 1.143) 58 | (xy -3.556 1.905) 59 | ) 60 | (stroke (width 0.1524) (type default) (color 0 0 0 0)) 61 | (fill (type none)) 62 | ) 63 | (polyline 64 | (pts 65 | (xy -3.556 0) 66 | (xy -3.175 -1.143) 67 | ) 68 | (stroke (width 0.1524) (type default) (color 0 0 0 0)) 69 | (fill (type none)) 70 | ) 71 | (polyline 72 | (pts 73 | (xy -3.556 1.905) 74 | (xy -3.175 0.762) 75 | ) 76 | (stroke (width 0.1524) (type default) (color 0 0 0 0)) 77 | (fill (type none)) 78 | ) 79 | (polyline 80 | (pts 81 | (xy -3.175 -1.143) 82 | (xy -4.318 -0.762) 83 | ) 84 | (stroke (width 0.1524) (type default) (color 0 0 0 0)) 85 | (fill (type none)) 86 | ) 87 | (polyline 88 | (pts 89 | (xy -3.175 0.762) 90 | (xy -4.318 1.143) 91 | ) 92 | (stroke (width 0.1524) (type default) (color 0 0 0 0)) 93 | (fill (type none)) 94 | ) 95 | (polyline 96 | (pts 97 | (xy 0 -0.635) 98 | (xy 0 -1.905) 99 | ) 100 | (stroke (width 0.254) (type default) (color 0 0 0 0)) 101 | (fill (type none)) 102 | ) 103 | (polyline 104 | (pts 105 | (xy 0 -0.635) 106 | (xy 2.54 -2.54) 107 | ) 108 | (stroke (width 0.254) (type default) (color 0 0 0 0)) 109 | (fill (type none)) 110 | ) 111 | (polyline 112 | (pts 113 | (xy 0 0.635) 114 | (xy 0 -0.635) 115 | ) 116 | (stroke (width 0.254) (type default) (color 0 0 0 0)) 117 | (fill (type none)) 118 | ) 119 | (polyline 120 | (pts 121 | (xy 0 0.635) 122 | (xy 2.54 2.54) 123 | ) 124 | (stroke (width 0.254) (type default) (color 0 0 0 0)) 125 | (fill (type none)) 126 | ) 127 | (polyline 128 | (pts 129 | (xy 0 1.905) 130 | (xy 0 0.635) 131 | ) 132 | (stroke (width 0.254) (type default) (color 0 0 0 0)) 133 | (fill (type none)) 134 | ) 135 | (polyline 136 | (pts 137 | (xy 2.286 -2.286) 138 | (xy 2.54 -2.54) 139 | ) 140 | (stroke (width 0.1524) (type default) (color 0 0 0 0)) 141 | (fill (type none)) 142 | ) 143 | (polyline 144 | (pts 145 | (xy -4.318 -0.762) 146 | (xy -3.175 -1.143) 147 | (xy -3.556 0) 148 | (xy -4.318 -0.762) 149 | ) 150 | (stroke (width 0.1524) (type default) (color 0 0 0 0)) 151 | (fill (type background)) 152 | ) 153 | (polyline 154 | (pts 155 | (xy -4.318 1.143) 156 | (xy -3.175 0.762) 157 | (xy -3.556 1.905) 158 | (xy -4.318 1.143) 159 | ) 160 | (stroke (width 0.1524) (type default) (color 0 0 0 0)) 161 | (fill (type background)) 162 | ) 163 | (polyline 164 | (pts 165 | (xy 2.54 -2.54) 166 | (xy 2.286 -1.524) 167 | (xy 1.524 -2.54) 168 | (xy 2.54 -2.54) 169 | ) 170 | (stroke (width 0.254) (type default) (color 0 0 0 0)) 171 | (fill (type background)) 172 | ) 173 | (circle (center 1.27 0) (radius 3.175) 174 | (stroke (width 0.254) (type default) (color 0 0 0 0)) 175 | (fill (type none)) 176 | ) 177 | (pin passive line (at 2.54 5.08 270) (length 2.54) 178 | (name "~" (effects (font (size 1.016 1.016)))) 179 | (number "1" (effects (font (size 1.016 1.016)))) 180 | ) 181 | (pin passive line (at 2.54 -5.08 90) (length 2.54) 182 | (name "~" (effects (font (size 1.016 1.016)))) 183 | (number "2" (effects (font (size 1.016 1.016)))) 184 | ) 185 | ) 186 | ) 187 | ) 188 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/components/ALS-PT19-315C_L177_TR8/XDCR_ALS-PT19-315C_L177_TR8.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "XDCR_ALS-PT19-315C_L177_TR8" (version 20211014) (generator pcbnew) 2 | (layer "F.Cu") 3 | (tedit 62FE5673) 4 | (attr smd) 5 | (fp_text reference "REF**" (at 0.032 -1.4064) (layer "F.SilkS") 6 | (effects (font (size 0.64 0.64) (thickness 0.15))) 7 | (tstamp c2871387-dff2-478e-8399-99c6f17e968d) 8 | ) 9 | (fp_text value "XDCR_ALS-PT19-315C/L177/TR8" (at 8.9728 1.4064) (layer "F.Fab") 10 | (effects (font (size 0.64 0.64) (thickness 0.15))) 11 | (tstamp 6fab2c3c-53cc-41c0-b135-fd503d1b8ab9) 12 | ) 13 | (fp_circle (center -1.75 0) (end -1.65 0) (layer "F.SilkS") (width 0.2) (fill none) (tstamp eb216172-356a-4877-ab9f-d2be135f03a3)) 14 | (fp_line (start 1.4 -0.65) (end -1.4 -0.65) (layer "F.CrtYd") (width 0.05) (tstamp 4f3d93c9-4b57-4ad4-8842-bd7b3f6a275d)) 15 | (fp_line (start 1.4 0.65) (end 1.4 -0.65) (layer "F.CrtYd") (width 0.05) (tstamp 859c1ab1-b27e-45ed-bfb2-a4a7cf35ace0)) 16 | (fp_line (start -1.4 0.65) (end 1.4 0.65) (layer "F.CrtYd") (width 0.05) (tstamp c71b5eab-3a09-4b6a-a599-c0bcc7f90df3)) 17 | (fp_line (start -1.4 -0.65) (end -1.4 0.65) (layer "F.CrtYd") (width 0.05) (tstamp f28c0538-c41c-4c36-99ab-20b3157c7225)) 18 | (fp_line (start 0.85 -0.4) (end -0.85 -0.4) (layer "F.Fab") (width 0.127) (tstamp 0a660368-8903-4df7-809a-61110abcc6c3)) 19 | (fp_line (start 0.85 0.4) (end 0.85 -0.4) (layer "F.Fab") (width 0.127) (tstamp 2e6b5c6c-0a49-45a9-a72f-a03a6ddbd3ec)) 20 | (fp_line (start -0.85 -0.4) (end -0.85 0.4) (layer "F.Fab") (width 0.127) (tstamp 4157576a-c1d8-4070-ac8f-9c6e70490625)) 21 | (fp_line (start -0.85 0.4) (end 0.85 0.4) (layer "F.Fab") (width 0.127) (tstamp d81a2466-09d8-456f-9498-ac6c81046151)) 22 | (fp_circle (center -1.75 0) (end -1.65 0) (layer "F.Fab") (width 0.2) (fill none) (tstamp f4674b5b-6d7f-437c-b9d0-ec8eecb86cc0)) 23 | (pad "1" smd rect (at -0.75 0) (size 0.8 0.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp dd69aef7-ce17-4efa-a03b-60f6fff1a8a1)) 24 | (pad "2" smd rect (at 0.75 0) (size 0.8 0.8) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp ff39c9a1-dd75-4680-bbf5-8890bda96d4e)) 25 | (model "${KIPRJMOD}/ALS-PT19-315C_L177_TR8/ALS-PT19-315C_L177_TR8.step" 26 | (offset (xyz 0 0 0)) 27 | (scale (xyz 1 1 1)) 28 | (rotate (xyz -90 0 0)) 29 | ) 30 | ) 31 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/components/ER-TFT013-2/ER-TFT013-2.kicad_sym: -------------------------------------------------------------------------------- 1 | (kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor) 2 | (symbol "ER-TFT013-2" (in_bom yes) (on_board yes) 3 | (property "Reference" "U" (id 0) (at 1.27 1.27 0) 4 | (effects (font (size 1.27 1.27))) 5 | ) 6 | (property "Value" "ER-TFT013-2" (id 1) (at 7.62 -1.27 0) 7 | (effects (font (size 1.27 1.27))) 8 | ) 9 | (property "Footprint" "ER-TFT013-2:ER-TFT013-2" (id 2) (at 0 0 0) 10 | (effects (font (size 1.27 1.27)) hide) 11 | ) 12 | (property "Datasheet" "https://www.buydisplay.com/download/manual/ER-TFT013-2_Datasheet.pdf" (id 3) (at 0 0 0) 13 | (effects (font (size 1.27 1.27)) hide) 14 | ) 15 | (symbol "ER-TFT013-2_0_0" 16 | (text "1.3\" 240x240 pixel" (at 24.13 -5.08 0) 17 | (effects (font (size 1.27 1.27))) 18 | ) 19 | (text "ST7789V2 Controller" (at 24.13 -8.89 0) 20 | (effects (font (size 1.27 1.27))) 21 | ) 22 | ) 23 | (symbol "ER-TFT013-2_0_1" 24 | (rectangle (start 0 0) (end 39.37 -33.02) 25 | (stroke (width 0) (type default) (color 0 0 0 0)) 26 | (fill (type none)) 27 | ) 28 | (rectangle (start 11.43 -2.54) (end 38.1 -31.75) 29 | (stroke (width 0) (type default) (color 0 0 0 0)) 30 | (fill (type none)) 31 | ) 32 | ) 33 | (symbol "ER-TFT013-2_1_1" 34 | (pin passive line (at -2.54 -3.81 0) (length 2.54) 35 | (name "GND" (effects (font (size 1.27 1.27)))) 36 | (number "1" (effects (font (size 1.27 1.27)))) 37 | ) 38 | (pin passive line (at -2.54 -26.67 0) (length 2.54) 39 | (name "SDA(MOSI)" (effects (font (size 1.27 1.27)))) 40 | (number "10" (effects (font (size 1.27 1.27)))) 41 | ) 42 | (pin passive line (at -2.54 -29.21 0) (length 2.54) 43 | (name "RESET" (effects (font (size 1.27 1.27)))) 44 | (number "11" (effects (font (size 1.27 1.27)))) 45 | ) 46 | (pin passive line (at -2.54 -31.75 0) (length 2.54) 47 | (name "GND" (effects (font (size 1.27 1.27)))) 48 | (number "12" (effects (font (size 1.27 1.27)))) 49 | ) 50 | (pin passive line (at -2.54 -6.35 0) (length 2.54) 51 | (name "LEDK" (effects (font (size 1.27 1.27)))) 52 | (number "2" (effects (font (size 1.27 1.27)))) 53 | ) 54 | (pin passive line (at -2.54 -8.89 0) (length 2.54) 55 | (name "LEDA" (effects (font (size 1.27 1.27)))) 56 | (number "3" (effects (font (size 1.27 1.27)))) 57 | ) 58 | (pin passive line (at -2.54 -11.43 0) (length 2.54) 59 | (name "VDD" (effects (font (size 1.27 1.27)))) 60 | (number "4" (effects (font (size 1.27 1.27)))) 61 | ) 62 | (pin passive line (at -2.54 -13.97 0) (length 2.54) 63 | (name "GND" (effects (font (size 1.27 1.27)))) 64 | (number "5" (effects (font (size 1.27 1.27)))) 65 | ) 66 | (pin passive line (at -2.54 -16.51 0) (length 2.54) 67 | (name "GND" (effects (font (size 1.27 1.27)))) 68 | (number "6" (effects (font (size 1.27 1.27)))) 69 | ) 70 | (pin passive line (at -2.54 -19.05 0) (length 2.54) 71 | (name "D/C" (effects (font (size 1.27 1.27)))) 72 | (number "7" (effects (font (size 1.27 1.27)))) 73 | ) 74 | (pin passive line (at -2.54 -21.59 0) (length 2.54) 75 | (name "CS" (effects (font (size 1.27 1.27)))) 76 | (number "8" (effects (font (size 1.27 1.27)))) 77 | ) 78 | (pin passive line (at -2.54 -24.13 0) (length 2.54) 79 | (name "SCL(SCK)" (effects (font (size 1.27 1.27)))) 80 | (number "9" (effects (font (size 1.27 1.27)))) 81 | ) 82 | ) 83 | ) 84 | ) 85 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/components/ER-TFT013-2/ER-TFT013-2.pretty/ER-TFT013-2.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "ER-TFT013-2" (version 20211014) (generator pcbnew) 2 | (layer "F.Cu") 3 | (tedit 62D89B2E) 4 | (attr smd) 5 | (fp_text reference "REF**" (at 2.7 -2.8 unlocked) (layer "F.SilkS") 6 | (effects (font (size 1 1) (thickness 0.15))) 7 | (tstamp d1901977-1d70-4717-b700-acf96875eda2) 8 | ) 9 | (fp_text value "ER-TFT013-2" (at 4.9 -0.9 unlocked) (layer "F.Fab") 10 | (effects (font (size 1 1) (thickness 0.15))) 11 | (tstamp 0bbe5e66-57d4-421d-bc47-4f547a6a7d32) 12 | ) 13 | (fp_text user "<= 1mm thick" (at 12.9 9.4 unlocked) (layer "Cmts.User") 14 | (effects (font (size 1 1) (thickness 0.15))) 15 | (tstamp 47e3fa14-6584-495e-aac4-0161e96d99b0) 16 | ) 17 | (fp_text user "12mm wide VHB Tape" (at 12.85 7.65 unlocked) (layer "Cmts.User") 18 | (effects (font (size 1 1) (thickness 0.15))) 19 | (tstamp f9cac9fb-0c92-4959-84cb-b2e833bab2a5) 20 | ) 21 | (fp_line (start 24.5 28) (end 7.35 28) (layer "B.SilkS") (width 0.12) (tstamp 545a501c-46e0-4825-8051-ae585ad02cba)) 22 | (fp_line (start 24.5 22.5) (end 24.5 28) (layer "B.SilkS") (width 0.12) (tstamp 91868619-2a15-44cb-a30c-0c98ed7b15b4)) 23 | (fp_line (start 7.35 28) (end 7.35 22.5) (layer "B.SilkS") (width 0.12) (tstamp e44ff483-e9e1-4e53-8d06-b9ad7537e4ea)) 24 | (fp_line (start 7.35 22.5) (end 24.5 22.5) (layer "B.SilkS") (width 0.12) (tstamp f6940540-024b-4b67-82d8-c303611dc502)) 25 | (fp_line (start 26.16 0) (end 26.16 29.22) (layer "F.SilkS") (width 0.12) (tstamp 465306fb-67a7-4593-b485-54b79a8596a0)) 26 | (fp_line (start 0 0) (end 26.16 0) (layer "F.SilkS") (width 0.12) (tstamp 56c269ed-381f-48d5-a537-023fe69c68a4)) 27 | (fp_line (start 0 29.22) (end 26.16 29.22) (layer "F.SilkS") (width 0.12) (tstamp cab41281-23c0-4214-8bd3-9ecbc9797685)) 28 | (fp_line (start 0 0) (end 0 29.22) (layer "F.SilkS") (width 0.12) (tstamp d900a280-8982-41ef-89e7-7858cf3e9b5d)) 29 | (fp_rect (start 1.85 5) (end 24.35 18) (layer "Cmts.User") (width 0.12) (fill none) (tstamp dfd8c25e-16b7-4b31-8e75-82d47a76b3c4)) 30 | (fp_line (start 4.6 30.5816) (end 23.7 30.5816) (layer "Edge.Cuts") (width 0.12) (tstamp acc0b90e-16aa-44e9-8e64-c5b23faa0a0b)) 31 | (fp_line (start 23.7 32.2072) (end 4.6 32.2072) (layer "Edge.Cuts") (width 0.12) (tstamp f84f03fb-bbe9-4667-95cb-5efc01fa2d55)) 32 | (fp_arc (start 23.7 30.5816) (mid 24.5128 31.3944) (end 23.7 32.2072) (layer "Edge.Cuts") (width 0.12) (tstamp 5a651ce4-2fe1-4cbe-9334-f3f60b3d73e7)) 33 | (fp_arc (start 4.6 32.2072) (mid 3.7872 31.3944) (end 4.6 30.5816) (layer "Edge.Cuts") (width 0.12) (tstamp 87d6c9e5-ec79-41c3-8200-9885b5813e87)) 34 | (pad "1" smd roundrect (at 19.85 23.4 180) (size 0.35 2.75) (layers "B.Cu" "B.Paste" "B.Mask") (roundrect_rratio 0.25) (tstamp 322df224-18ca-42c6-9435-6771d7bd5c2c)) 35 | (pad "2" smd roundrect (at 19.15 23.4 180) (size 0.35 2.75) (layers "B.Cu" "B.Paste" "B.Mask") (roundrect_rratio 0.25) (tstamp 89e2ef4c-4090-432a-8866-125dae67e5cc)) 36 | (pad "3" smd roundrect (at 18.45 23.4 180) (size 0.35 2.75) (layers "B.Cu" "B.Paste" "B.Mask") (roundrect_rratio 0.25) (tstamp 19296754-cfae-4c82-a503-4ac328bb988d)) 37 | (pad "4" smd roundrect (at 17.75 23.4 180) (size 0.35 2.75) (layers "B.Cu" "B.Paste" "B.Mask") (roundrect_rratio 0.25) (tstamp 6a29c38c-bb3e-482d-92ff-d36c55bc13aa)) 38 | (pad "5" smd roundrect (at 17.05 23.4 180) (size 0.35 2.75) (layers "B.Cu" "B.Paste" "B.Mask") (roundrect_rratio 0.25) (tstamp 0e7d9a8c-263b-4bed-914a-04cc6f5ffe2f)) 39 | (pad "6" smd roundrect (at 16.35 23.4 180) (size 0.35 2.75) (layers "B.Cu" "B.Paste" "B.Mask") (roundrect_rratio 0.25) (tstamp 7abdee82-2733-46ae-8c0e-19ec64725cfc)) 40 | (pad "7" smd roundrect (at 15.65 23.4 180) (size 0.35 2.75) (layers "B.Cu" "B.Paste" "B.Mask") (roundrect_rratio 0.25) (tstamp c9a9e3e5-a97f-4e5c-825e-b53c171ec8f5)) 41 | (pad "8" smd roundrect (at 14.95 23.4 180) (size 0.35 2.75) (layers "B.Cu" "B.Paste" "B.Mask") (roundrect_rratio 0.25) (tstamp fc436d63-e487-4333-9eb9-5c8ecfb75d73)) 42 | (pad "9" smd roundrect (at 14.25 23.4 180) (size 0.35 2.75) (layers "B.Cu" "B.Paste" "B.Mask") (roundrect_rratio 0.25) (tstamp d8412e4e-aa02-4b2f-a93d-4e097473fdd7)) 43 | (pad "10" smd roundrect (at 13.55 23.4 180) (size 0.35 2.75) (layers "B.Cu" "B.Paste" "B.Mask") (roundrect_rratio 0.25) (tstamp 66b77e57-c0f2-4755-ac26-25efb54f713f)) 44 | (pad "11" smd roundrect (at 12.85 23.4 180) (size 0.35 2.75) (layers "B.Cu" "B.Paste" "B.Mask") (roundrect_rratio 0.25) (tstamp 59546f26-140c-460d-aec2-2248908852d8)) 45 | (pad "12" smd roundrect (at 12.15 23.4 180) (size 0.35 2.75) (layers "B.Cu" "B.Paste" "B.Mask") (roundrect_rratio 0.25) (tstamp 5c4fdf73-7145-4ede-8b5b-2b0705d3f994)) 46 | (model "${KIPRJMOD}/display/display.pretty/1.3 TFT IPS - Flush Reverse Mount.stp" 47 | (offset (xyz 13.115 -14.9 0)) 48 | (scale (xyz 1 1 1)) 49 | (rotate (xyz 0 0 0)) 50 | ) 51 | ) 52 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/components/IN-S32GTLS/IN-S32GTLS.kicad_sym: -------------------------------------------------------------------------------- 1 | (kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor) 2 | (symbol "IN-S32GTLS" (pin_names (offset 0.254)) (in_bom yes) (on_board yes) 3 | (property "Reference" "U" (id 0) (at 20.32 10.16 0) 4 | (effects (font (size 1.524 1.524))) 5 | ) 6 | (property "Value" "IN-S32GTLS" (id 1) (at 20.32 7.62 0) 7 | (effects (font (size 1.524 1.524))) 8 | ) 9 | (property "Footprint" "IN-S32GTLS_INL" (id 2) (at 20.32 6.096 0) 10 | (effects (font (size 1.524 1.524)) hide) 11 | ) 12 | (property "Datasheet" "" (id 3) (at 0 0 0) 13 | (effects (font (size 1.524 1.524))) 14 | ) 15 | (property "ki_locked" "" (id 4) (at 0 0 0) 16 | (effects (font (size 1.27 1.27))) 17 | ) 18 | (property "ki_fp_filters" "IN-S32GTLS_INL IN-S32GTLS_INL-M IN-S32GTLS_INL-L" (id 5) (at 0 0 0) 19 | (effects (font (size 1.27 1.27)) hide) 20 | ) 21 | (symbol "IN-S32GTLS_1_1" 22 | (polyline 23 | (pts 24 | (xy 7.62 -7.62) 25 | (xy 33.02 -7.62) 26 | ) 27 | (stroke (width 0.127) (type default) (color 0 0 0 0)) 28 | (fill (type none)) 29 | ) 30 | (polyline 31 | (pts 32 | (xy 7.62 5.08) 33 | (xy 7.62 -7.62) 34 | ) 35 | (stroke (width 0.127) (type default) (color 0 0 0 0)) 36 | (fill (type none)) 37 | ) 38 | (polyline 39 | (pts 40 | (xy 33.02 -7.62) 41 | (xy 33.02 5.08) 42 | ) 43 | (stroke (width 0.127) (type default) (color 0 0 0 0)) 44 | (fill (type none)) 45 | ) 46 | (polyline 47 | (pts 48 | (xy 33.02 5.08) 49 | (xy 7.62 5.08) 50 | ) 51 | (stroke (width 0.127) (type default) (color 0 0 0 0)) 52 | (fill (type none)) 53 | ) 54 | (pin unspecified line (at 0 0 0) (length 7.62) 55 | (name "1" (effects (font (size 1.4986 1.4986)))) 56 | (number "1" (effects (font (size 1.4986 1.4986)))) 57 | ) 58 | (pin unspecified line (at 0 -2.54 0) (length 7.62) 59 | (name "2" (effects (font (size 1.4986 1.4986)))) 60 | (number "2" (effects (font (size 1.4986 1.4986)))) 61 | ) 62 | (pin unspecified line (at 40.64 -2.54 180) (length 7.62) 63 | (name "3" (effects (font (size 1.4986 1.4986)))) 64 | (number "3" (effects (font (size 1.4986 1.4986)))) 65 | ) 66 | (pin unspecified line (at 40.64 0 180) (length 7.62) 67 | (name "4" (effects (font (size 1.4986 1.4986)))) 68 | (number "4" (effects (font (size 1.4986 1.4986)))) 69 | ) 70 | ) 71 | ) 72 | ) 73 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/components/IN-S32GTLS/IN-S32GTLS.pretty/IN-S32GTLS.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "IN-S32GTLS" (version 20211014) (generator pcbnew) 2 | (layer "F.Cu") 3 | (tedit 0) 4 | (attr through_hole) 5 | (fp_text reference "REF**" (at 0 0) (layer "F.SilkS") 6 | (effects (font (size 1 1) (thickness 0.15))) 7 | (tstamp dfa551c2-c0c5-4ae7-ad14-29bb0552a418) 8 | ) 9 | (fp_text value "IN-S32GTLS_INL" (at 0 0) (layer "F.SilkS") 10 | (effects (font (size 1 1) (thickness 0.15))) 11 | (tstamp 24a9a311-f95d-4811-a547-a13e9856ab66) 12 | ) 13 | (fp_text user "*" (at 0 0) (layer "F.SilkS") 14 | (effects (font (size 1 1) (thickness 0.15))) 15 | (tstamp b42c66bb-c3e7-4a30-a76b-4ae7d4bfa2c5) 16 | ) 17 | (fp_text user "*" (at 0 0) (layer "F.Fab") 18 | (effects (font (size 1 1) (thickness 0.15))) 19 | (tstamp 1df307d5-f5c1-4a98-8351-134a596baed1) 20 | ) 21 | (fp_line (start 0.859423 -1.4732) (end -0.859423 -1.4732) (layer "F.SilkS") (width 0.12) (tstamp 5de4fb83-a2a5-4d97-b8bf-6bb926b7ed26)) 22 | (fp_line (start -0.859423 1.4732) (end 0.859423 1.4732) (layer "F.SilkS") (width 0.12) (tstamp f5cc8b2f-32e9-402b-8f94-ead53b695f7e)) 23 | (fp_circle (center -1.8542 -1.6256) (end -1.7526 -1.6256) (layer "F.SilkS") (width 0.12) (fill none) (tstamp 7ba991b8-9da7-402f-ab19-ed861d540929)) 24 | (fp_line (start 1.8542 -1.6002) (end 1.8542 -1.4485) (layer "F.CrtYd") (width 0.05) (tstamp 0241e39d-cbf2-4878-bc88-426760024fb3)) 25 | (fp_line (start -1.8542 1.4485) (end -1.8542 -1.4485) (layer "F.CrtYd") (width 0.05) (tstamp 047d0789-3cba-4be9-ae62-484292299bf9)) 26 | (fp_line (start -1.8542 1.6002) (end -1.8542 1.4485) (layer "F.CrtYd") (width 0.05) (tstamp 0b698f41-47d2-498d-bfa7-2d83f3ce35fe)) 27 | (fp_line (start 1.8542 1.6002) (end -1.8542 1.6002) (layer "F.CrtYd") (width 0.05) (tstamp 0ebf1822-1a06-4a1f-a95f-9b37f3896a80)) 28 | (fp_line (start -1.8542 -1.6002) (end 1.8542 -1.6002) (layer "F.CrtYd") (width 0.05) (tstamp 0f193e47-10bf-4d93-9419-04ffd2142664)) 29 | (fp_line (start -1.8542 1.4485) (end -1.8542 1.4485) (layer "F.CrtYd") (width 0.05) (tstamp 11f68c4c-3348-4304-9fae-cc71207490f1)) 30 | (fp_line (start -1.8542 -1.4485) (end -1.8542 -1.4485) (layer "F.CrtYd") (width 0.05) (tstamp 156100e2-16cf-4d08-979f-b9bc9d2f9f2a)) 31 | (fp_line (start 1.8542 1.4485) (end 1.8542 1.4485) (layer "F.CrtYd") (width 0.05) (tstamp 1debf5bd-3602-44f3-a2e4-14e239210197)) 32 | (fp_line (start 1.8542 -1.4485) (end 1.8542 -1.4485) (layer "F.CrtYd") (width 0.05) (tstamp 26dc4c08-28ce-4104-8f5b-f695d75e618a)) 33 | (fp_line (start -1.8542 1.6002) (end -1.8542 1.4485) (layer "F.CrtYd") (width 0.05) (tstamp 29aa79fa-a957-41ca-85c1-c21596e72b73)) 34 | (fp_line (start -1.8542 -1.6002) (end 1.8542 -1.6002) (layer "F.CrtYd") (width 0.05) (tstamp 2b0b33c3-bd6c-4c68-9ae1-1d2a07337541)) 35 | (fp_line (start 1.8542 -1.4485) (end 1.8542 -1.4485) (layer "F.CrtYd") (width 0.05) (tstamp 36776982-780e-4dd9-bb0c-b8e22a0366b2)) 36 | (fp_line (start 1.8542 -1.4485) (end 1.8542 1.4485) (layer "F.CrtYd") (width 0.05) (tstamp 3a908eed-32d9-4805-89a1-3598b10ffa17)) 37 | (fp_line (start 1.8542 1.4485) (end 1.8542 1.6002) (layer "F.CrtYd") (width 0.05) (tstamp 417be04e-3fe1-461c-b4cc-803395cd9f51)) 38 | (fp_line (start -1.8542 -1.4485) (end -1.8542 -1.6002) (layer "F.CrtYd") (width 0.05) (tstamp 6df34066-863f-4160-b1c6-1d4e6f7b9436)) 39 | (fp_line (start -1.8542 1.4485) (end -1.8542 -1.4485) (layer "F.CrtYd") (width 0.05) (tstamp 73992a3e-4003-48d4-932d-0b080ed9960c)) 40 | (fp_line (start 1.8542 -1.6002) (end 1.8542 -1.4485) (layer "F.CrtYd") (width 0.05) (tstamp 832609ea-4ae1-4faa-b5f0-709533c7ca08)) 41 | (fp_line (start 1.8542 1.4485) (end 1.8542 1.4485) (layer "F.CrtYd") (width 0.05) (tstamp 9d663df5-1a20-4180-81dc-b4b6b91efa78)) 42 | (fp_line (start -1.8542 -1.4485) (end -1.8542 -1.6002) (layer "F.CrtYd") (width 0.05) (tstamp a66877f0-8141-4170-b52b-b3fe28ceb69f)) 43 | (fp_line (start 1.8542 1.6002) (end -1.8542 1.6002) (layer "F.CrtYd") (width 0.05) (tstamp b4743891-6912-482b-b412-51f554a31f22)) 44 | (fp_line (start -1.8542 1.4485) (end -1.8542 1.4485) (layer "F.CrtYd") (width 0.05) (tstamp e57c2103-bf27-4e5f-b5cb-27c7700f7120)) 45 | (fp_line (start -1.8542 -1.4485) (end -1.8542 -1.4485) (layer "F.CrtYd") (width 0.05) (tstamp ee12fa4a-0470-4d87-8703-47bfecbd1828)) 46 | (fp_line (start 1.8542 -1.4485) (end 1.8542 1.4485) (layer "F.CrtYd") (width 0.05) (tstamp f1f14e85-a98d-4a99-93be-83aeb6c0c4f2)) 47 | (fp_line (start 1.8542 1.4485) (end 1.8542 1.6002) (layer "F.CrtYd") (width 0.05) (tstamp f43d66cf-ce78-4822-ab80-3a936c79c6ea)) 48 | (fp_line (start -1.6002 -1.3462) (end -1.6002 1.3462) (layer "F.Fab") (width 0.1) (tstamp 2f3baf3d-f9bd-480a-ab95-5be6a25c565f)) 49 | (fp_line (start 1.6002 -1.3462) (end -1.6002 -1.3462) (layer "F.Fab") (width 0.1) (tstamp 918a04f8-4a07-4f54-b95c-6ce9812a1006)) 50 | (fp_line (start 1.6002 1.3462) (end 1.6002 -1.3462) (layer "F.Fab") (width 0.1) (tstamp dc4a080c-a6cd-47f4-986d-3dfa4fb3139d)) 51 | (fp_line (start -1.6002 1.3462) (end 1.6002 1.3462) (layer "F.Fab") (width 0.1) (tstamp fa38557a-a8fa-4589-9910-d87be92dbd04)) 52 | (fp_arc (start 0.3048 -1.3462) (mid 0 -1.0414) (end -0.3048 -1.3462) (layer "F.Fab") (width 0.1) (tstamp ef867bb6-ba71-410b-8962-661949f7ac8c)) 53 | (fp_circle (center -1.041201 -0.75) (end -0.965001 -0.75) (layer "F.Fab") (width 0.1) (fill none) (tstamp 87b0508d-e8f0-423a-bc1a-2447dfca9bfd)) 54 | (pad "1" smd rect (at -1.320599 -0.750001) (size 0.5588 0.889) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp fbf7720f-0a58-4bd3-a0d0-cd8897ab13ed)) 55 | (pad "2" smd rect (at -1.320599 0.750001) (size 0.5588 0.889) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 4ef99cf6-f444-45a5-9d9b-5cb57b989e29)) 56 | (pad "3" smd rect (at 1.320599 0.750001) (size 0.5588 0.889) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 06ec4f72-13ef-4425-8974-423ddcd7f655)) 57 | (pad "4" smd rect (at 1.320599 -0.750001) (size 0.5588 0.889) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 450b7507-d583-4615-844b-b9a6fd249332)) 58 | ) 59 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/components/NT3H2211W0FHKH/NT3H2211W0FHKH.kicad_sym: -------------------------------------------------------------------------------- 1 | (kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor) 2 | (symbol "NT3H2211W0FHKH" (pin_names (offset 1.016)) (in_bom yes) (on_board yes) 3 | (property "Reference" "U" (id 0) (at -12.7 13.462 0) 4 | (effects (font (size 1.27 1.27)) (justify left bottom)) 5 | ) 6 | (property "Value" "NT3H2211W0FHKH" (id 1) (at -12.7 -15.24 0) 7 | (effects (font (size 1.27 1.27)) (justify left bottom)) 8 | ) 9 | (property "Footprint" "IC_NT3H2211W0FHKH" (id 2) (at 0 0 0) 10 | (effects (font (size 1.27 1.27)) (justify left bottom) hide) 11 | ) 12 | (property "Datasheet" "" (id 3) (at 0 0 0) 13 | (effects (font (size 1.27 1.27)) (justify left bottom) hide) 14 | ) 15 | (property "PARTREV" "3.4" (id 4) (at 0 0 0) 16 | (effects (font (size 1.27 1.27)) (justify left bottom) hide) 17 | ) 18 | (property "MANUFACTURER" "NXP" (id 5) (at 0 0 0) 19 | (effects (font (size 1.27 1.27)) (justify left bottom) hide) 20 | ) 21 | (property "MAXIMUM_PACKAGE_HEIGHT" "0.5mm" (id 6) (at 0 0 0) 22 | (effects (font (size 1.27 1.27)) (justify left bottom) hide) 23 | ) 24 | (property "STANDARD" "Manufacturer Recommendation" (id 7) (at 0 0 0) 25 | (effects (font (size 1.27 1.27)) (justify left bottom) hide) 26 | ) 27 | (property "ki_locked" "" (id 8) (at 0 0 0) 28 | (effects (font (size 1.27 1.27))) 29 | ) 30 | (symbol "NT3H2211W0FHKH_0_0" 31 | (rectangle (start -12.7 -12.7) (end 12.7 12.7) 32 | (stroke (width 0.254) (type default) (color 0 0 0 0)) 33 | (fill (type background)) 34 | ) 35 | (pin bidirectional line (at 17.78 -2.54 180) (length 5.08) 36 | (name "LA" (effects (font (size 1.016 1.016)))) 37 | (number "1" (effects (font (size 1.016 1.016)))) 38 | ) 39 | (pin power_in line (at 17.78 -10.16 180) (length 5.08) 40 | (name "VSS" (effects (font (size 1.016 1.016)))) 41 | (number "2" (effects (font (size 1.016 1.016)))) 42 | ) 43 | (pin input clock (at -17.78 0 0) (length 5.08) 44 | (name "SCL" (effects (font (size 1.016 1.016)))) 45 | (number "3" (effects (font (size 1.016 1.016)))) 46 | ) 47 | (pin output line (at 17.78 2.54 180) (length 5.08) 48 | (name "FD" (effects (font (size 1.016 1.016)))) 49 | (number "4" (effects (font (size 1.016 1.016)))) 50 | ) 51 | (pin bidirectional line (at -17.78 -2.54 0) (length 5.08) 52 | (name "SDA" (effects (font (size 1.016 1.016)))) 53 | (number "5" (effects (font (size 1.016 1.016)))) 54 | ) 55 | (pin power_in line (at 17.78 10.16 180) (length 5.08) 56 | (name "VCC" (effects (font (size 1.016 1.016)))) 57 | (number "6" (effects (font (size 1.016 1.016)))) 58 | ) 59 | (pin output line (at 17.78 5.08 180) (length 5.08) 60 | (name "VOUT" (effects (font (size 1.016 1.016)))) 61 | (number "7" (effects (font (size 1.016 1.016)))) 62 | ) 63 | (pin bidirectional line (at 17.78 -5.08 180) (length 5.08) 64 | (name "LB" (effects (font (size 1.016 1.016)))) 65 | (number "8" (effects (font (size 1.016 1.016)))) 66 | ) 67 | ) 68 | ) 69 | ) 70 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/components/NT3H2211W0FHKH/NT3H2211W0FHKH.pretty/IC_NT3H2211W0FHKH.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "IC_NT3H2211W0FHKH" (version 20211014) (generator pcbnew) 2 | (layer "F.Cu") 3 | (tedit 62D4E7EA) 4 | (attr smd) 5 | (fp_text reference "REF**" (at 1.905 -1.905) (layer "F.SilkS") 6 | (effects (font (size 1 1) (thickness 0.15))) 7 | (tstamp 5aa2377c-7178-43e1-95b9-15e9702e3e4a) 8 | ) 9 | (fp_text value "IC_NT3H2211W0FHKH" (at 9.525 1.905) (layer "F.Fab") 10 | (effects (font (size 1 1) (thickness 0.15))) 11 | (tstamp bf1097de-f94a-428a-a202-63c0f428aa84) 12 | ) 13 | (fp_poly (pts 14 | (xy -0.8 0.39) 15 | (xy -0.4 0.39) 16 | (xy -0.4 0.61) 17 | (xy -0.8 0.61) 18 | ) (layer "F.Paste") (width 0.01) (fill solid) (tstamp 559fa15e-6536-4268-8963-91f168637452)) 19 | (fp_poly (pts 20 | (xy 0.4 -0.11) 21 | (xy 0.8 -0.11) 22 | (xy 0.8 0.11) 23 | (xy 0.4 0.11) 24 | ) (layer "F.Paste") (width 0.01) (fill solid) (tstamp 72559e5e-dc67-4892-bd6f-c9fcebd2fe81)) 25 | (fp_poly (pts 26 | (xy 0.4 -0.61) 27 | (xy 0.8 -0.61) 28 | (xy 0.8 -0.39) 29 | (xy 0.4 -0.39) 30 | ) (layer "F.Paste") (width 0.01) (fill solid) (tstamp 86321dc6-0921-4f1a-bb6e-6ddd5e73d594)) 31 | (fp_poly (pts 32 | (xy -0.8 -0.11) 33 | (xy -0.4 -0.11) 34 | (xy -0.4 0.11) 35 | (xy -0.8 0.11) 36 | ) (layer "F.Paste") (width 0.01) (fill solid) (tstamp 90e3d276-68c2-4a60-a195-c21c74639cfd)) 37 | (fp_poly (pts 38 | (xy -0.8 -0.71) 39 | (xy -0.4 -0.71) 40 | (xy -0.4 -0.39) 41 | (xy -0.8 -0.39) 42 | ) (layer "F.Paste") (width 0.01) (fill solid) (tstamp c24679e7-e3fa-4deb-8962-1dbde8e05562)) 43 | (fp_poly (pts 44 | (xy 0.4 0.39) 45 | (xy 0.8 0.39) 46 | (xy 0.8 0.61) 47 | (xy 0.4 0.61) 48 | ) (layer "F.Paste") (width 0.01) (fill solid) (tstamp c831e69a-ec43-40d2-941a-19dc53291bc2)) 49 | (fp_poly (pts 50 | (xy -0.112179 0.798983) 51 | (xy -0.112179 0.398983) 52 | (xy 0.107821 0.398983) 53 | (xy 0.107821 0.798983) 54 | ) (layer "F.Paste") (width 0.01) (fill solid) (tstamp e6fd90e7-4aee-4926-9b60-7ce87eaa074d)) 55 | (fp_poly (pts 56 | (xy 0.110273 -0.79842) 57 | (xy 0.110273 -0.39842) 58 | (xy -0.109727 -0.39842) 59 | (xy -0.109727 -0.79842) 60 | ) (layer "F.Paste") (width 0.01) (fill solid) (tstamp e730bf03-1bc8-4b90-84c2-fbf8a0daf591)) 61 | (fp_line (start 0.825 0.95) (end 0.4 0.95) (layer "F.SilkS") (width 0.127) (tstamp 0e72e733-4203-4978-bf14-d99eee0c3f7a)) 62 | (fp_line (start 0.825 -0.95) (end 0.4 -0.95) (layer "F.SilkS") (width 0.127) (tstamp 12a8cdb5-27f1-4122-9c23-33ef380df39d)) 63 | (fp_line (start -0.825 0.95) (end -0.4 0.95) (layer "F.SilkS") (width 0.127) (tstamp 53433c43-ed01-4b19-a013-84d87a57ce25)) 64 | (fp_line (start -0.825 -0.95) (end -0.4 -0.95) (layer "F.SilkS") (width 0.127) (tstamp c633a507-391a-45e0-84f7-5279701641a9)) 65 | (fp_circle (center -1.25 -0.55) (end -1.179291 -0.55) (layer "F.SilkS") (width 0.2) (fill none) (tstamp 44f686b0-b906-464d-95b8-f9f1d239a8d7)) 66 | (fp_line (start 1.075 -1.075) (end 1.075 1.075) (layer "F.CrtYd") (width 0.05) (tstamp 0616fa2e-c110-4222-823f-f261c768a74c)) 67 | (fp_line (start -1.075 -1.075) (end 1.075 -1.075) (layer "F.CrtYd") (width 0.05) (tstamp 9f12cf83-fd6e-4ae0-9029-5fb2df5ba8ba)) 68 | (fp_line (start -1.075 1.075) (end -1.075 -1.075) (layer "F.CrtYd") (width 0.05) (tstamp a64c66c9-d454-4ead-912a-ea0dd29dcdce)) 69 | (fp_line (start 1.075 1.075) (end -1.075 1.075) (layer "F.CrtYd") (width 0.05) (tstamp cec44d3f-a5d1-4b77-9307-5cb4a2b49997)) 70 | (fp_line (start -0.825 0.825) (end -0.825 -0.825) (layer "F.Fab") (width 0.127) (tstamp 31a427fe-b477-4e1d-a301-28528dd0a052)) 71 | (fp_line (start 0.825 0.825) (end -0.825 0.825) (layer "F.Fab") (width 0.127) (tstamp 7e4bca07-2102-4245-b55e-c4d35a96f776)) 72 | (fp_line (start -0.825 -0.825) (end 0.825 -0.825) (layer "F.Fab") (width 0.127) (tstamp 95e082ff-0dc3-4247-b8b2-de1e3675c216)) 73 | (fp_line (start 0.825 -0.825) (end 0.825 0.825) (layer "F.Fab") (width 0.127) (tstamp a795d4ad-f9ce-4270-a308-f881bbd4a680)) 74 | (fp_circle (center -1.25 -0.55) (end -1.179291 -0.55) (layer "F.Fab") (width 0.2) (fill none) (tstamp b650c301-b6c5-4eae-8fa3-8ec22bfae7ce)) 75 | (pad "1" smd rect (at -0.6 -0.55 180) (size 0.45 0.37) (layers "F.Cu" "F.Mask") (tstamp f7b8a673-7d24-4a2c-a808-76110ad61ed9)) 76 | (pad "2" smd rect (at -0.6 0 180) (size 0.45 0.27) (layers "F.Cu" "F.Mask") (tstamp 34d08571-ca71-4ab2-bb59-60a924f921ac)) 77 | (pad "3" smd rect (at -0.6 0.5 180) (size 0.45 0.27) (layers "F.Cu" "F.Mask") (tstamp e967634f-3aec-4afd-8d4b-ed4376178714)) 78 | (pad "4" smd rect (at 0 0.6 270) (size 0.45 0.27) (layers "F.Cu" "F.Mask") (tstamp c6e29b0e-3af6-4b06-bc3d-ec64dcf2c104)) 79 | (pad "5" smd rect (at 0.6 0.5 180) (size 0.45 0.27) (layers "F.Cu" "F.Mask") (tstamp 5507873f-d07c-4080-81b2-c1c16f0c9985)) 80 | (pad "6" smd rect (at 0.6 0 180) (size 0.45 0.27) (layers "F.Cu" "F.Mask") (tstamp 158a72d8-e954-42ae-9311-56c588f3288f)) 81 | (pad "7" smd rect (at 0.6 -0.5 180) (size 0.45 0.27) (layers "F.Cu" "F.Mask") (tstamp 35f1afdc-d16d-42de-bad2-e7c128988239)) 82 | (pad "8" smd rect (at 0 -0.6 270) (size 0.45 0.27) (layers "F.Cu" "F.Mask") (tstamp 249ba7ae-27ea-42cc-acee-bf9e8bea3942)) 83 | (zone (net 0) (net_name "") (layer "F.Cu") (tstamp 4d14f740-c6bd-4a01-b718-fb2c72fec0eb) (hatch full 0.508) 84 | (connect_pads (clearance 0)) 85 | (min_thickness 0.01) 86 | (keepout (tracks not_allowed) (vias not_allowed) (pads not_allowed) (copperpour not_allowed) (footprints allowed)) 87 | (fill (thermal_gap 0.508) (thermal_bridge_width 0.508)) 88 | (polygon 89 | (pts 90 | (xy -0.25 -0.25) 91 | (xy 0.25 -0.25) 92 | (xy 0.25 0.25) 93 | (xy -0.25 0.25) 94 | ) 95 | ) 96 | ) 97 | (model "${KIPRJMOD}/NT3H2211W0FHKH/NT3H2211W0FHKH.pretty/NT3H2211W0FHKH.step" 98 | (offset (xyz 0 0 0)) 99 | (scale (xyz 1 1 1)) 100 | (rotate (xyz -90 0 0)) 101 | ) 102 | ) 103 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/components/PTS815/PTS815.kicad_sym: -------------------------------------------------------------------------------- 1 | (kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor) 2 | (symbol "PTS815_SJM_250_SMTR_LFS" (pin_names (offset 0.254)) (in_bom yes) (on_board yes) 3 | (property "Reference" "SW" (id 0) (at 0 10.16 0) 4 | (effects (font (size 1.524 1.524))) 5 | ) 6 | (property "Value" "PTS815_SJM_250_SMTR_LFS" (id 1) (at 0 7.62 0) 7 | (effects (font (size 1.524 1.524))) 8 | ) 9 | (property "Footprint" "PTS815 SJM 250 SMTR LFS_CNK" (id 2) (at 0 6.096 0) 10 | (effects (font (size 1.524 1.524)) hide) 11 | ) 12 | (property "Datasheet" "" (id 3) (at -40.64 2.54 0) 13 | (effects (font (size 1.524 1.524))) 14 | ) 15 | (property "ki_locked" "" (id 4) (at 0 0 0) 16 | (effects (font (size 1.27 1.27))) 17 | ) 18 | (property "ki_fp_filters" "SW4_PTS815" (id 5) (at 0 0 0) 19 | (effects (font (size 1.27 1.27)) hide) 20 | ) 21 | (symbol "PTS815_SJM_250_SMTR_LFS_0_1" 22 | (pin passive line (at -5.08 2.54 0) (length 2.54) 23 | (name "1" (effects (font (size 1.27 1.27)))) 24 | (number "1" (effects (font (size 1.27 1.27)))) 25 | ) 26 | (pin passive line (at 5.08 2.54 180) (length 2.54) 27 | (name "2" (effects (font (size 1.27 1.27)))) 28 | (number "2" (effects (font (size 1.27 1.27)))) 29 | ) 30 | (pin passive line (at -5.08 -2.54 0) (length 2.54) 31 | (name "3" (effects (font (size 1.27 1.27)))) 32 | (number "3" (effects (font (size 1.27 1.27)))) 33 | ) 34 | (pin passive line (at 5.08 -2.54 180) (length 2.54) 35 | (name "4" (effects (font (size 1.27 1.27)))) 36 | (number "4" (effects (font (size 1.27 1.27)))) 37 | ) 38 | ) 39 | (symbol "PTS815_SJM_250_SMTR_LFS_1_1" 40 | (circle (center 0 -1.27) (radius 0.127) 41 | (stroke (width 0.508) (type default) (color 0 0 0 0)) 42 | (fill (type none)) 43 | ) 44 | (polyline 45 | (pts 46 | (xy -2.54 -2.54) 47 | (xy 2.54 -2.54) 48 | ) 49 | (stroke (width 0) (type default) (color 0 0 0 0)) 50 | (fill (type none)) 51 | ) 52 | (polyline 53 | (pts 54 | (xy -1.27 -1.27) 55 | (xy 0 1.27) 56 | ) 57 | (stroke (width 0.127) (type default) (color 0 0 0 0)) 58 | (fill (type none)) 59 | ) 60 | (polyline 61 | (pts 62 | (xy 0 -1.27) 63 | (xy 0 -2.54) 64 | ) 65 | (stroke (width 0.127) (type default) (color 0 0 0 0)) 66 | (fill (type none)) 67 | ) 68 | (polyline 69 | (pts 70 | (xy 0 1.27) 71 | (xy 0 2.54) 72 | ) 73 | (stroke (width 0.127) (type default) (color 0 0 0 0)) 74 | (fill (type none)) 75 | ) 76 | (polyline 77 | (pts 78 | (xy 2.54 2.54) 79 | (xy -2.54 2.54) 80 | ) 81 | (stroke (width 0) (type default) (color 0 0 0 0)) 82 | (fill (type none)) 83 | ) 84 | (circle (center 0 1.27) (radius 0.127) 85 | (stroke (width 0.508) (type default) (color 0 0 0 0)) 86 | (fill (type none)) 87 | ) 88 | ) 89 | ) 90 | ) 91 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/components/PTS815/PTS815.pretty/PTS815 SJM 250 SMTR LFS.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "PTS815 SJM 250 SMTR LFS" (version 20211014) (generator pcbnew) 2 | (layer "F.Cu") 3 | (tedit 0) 4 | (attr smd) 5 | (fp_text reference "REF**" (at 0 0) (layer "F.SilkS") 6 | (effects (font (size 1 1) (thickness 0.15))) 7 | (tstamp 1dcacadc-de22-4ea6-9f8a-d23eda644c4e) 8 | ) 9 | (fp_text value "SW4_PTS815_SJM_250_SMTR_LFS_CNK" (at 0 0) (layer "F.SilkS") 10 | (effects (font (size 1 1) (thickness 0.15))) 11 | (tstamp e1463d01-3e0a-4131-90a2-bd2050c57359) 12 | ) 13 | (fp_text user "*" (at 0 0) (layer "F.SilkS") 14 | (effects (font (size 1 1) (thickness 0.15))) 15 | (tstamp 37db6bfb-b2df-44ed-8394-d065e1dd64c9) 16 | ) 17 | (fp_text user "*" (at 0 0) (layer "F.Fab") 18 | (effects (font (size 1 1) (thickness 0.15))) 19 | (tstamp fb0e7c76-1a70-4dc7-bc6c-e0105f5ca3aa) 20 | ) 21 | (fp_line (start 2.3241 0.386659) (end 2.3241 -0.386659) (layer "F.SilkS") (width 0.12) (tstamp 19e5637d-6cd0-4598-8c26-30a6e06d8be7)) 22 | (fp_line (start 2.3241 -1.8288) (end -2.3241 -1.8288) (layer "F.SilkS") (width 0.12) (tstamp 775ca73b-dace-4708-b6d6-8fb7075f2cef)) 23 | (fp_line (start -2.3241 1.8288) (end 2.3241 1.8288) (layer "F.SilkS") (width 0.12) (tstamp e467ca4b-4903-4e7a-b62d-c263e63ad495)) 24 | (fp_line (start -2.3241 -0.386659) (end -2.3241 0.386659) (layer "F.SilkS") (width 0.12) (tstamp ef09a926-c701-462c-a7a2-8867d47e2bf0)) 25 | (fp_line (start 2.999301 -1.9558) (end -2.999301 -1.9558) (layer "F.CrtYd") (width 0.05) (tstamp 06e0f363-ac46-4fb6-8fa3-86d549e0309d)) 26 | (fp_line (start -2.999301 -1.9558) (end -2.999301 1.9558) (layer "F.CrtYd") (width 0.05) (tstamp 3b6ae67e-1a06-4585-9b19-8b8daa22189c)) 27 | (fp_line (start -2.999301 1.9558) (end 2.999301 1.9558) (layer "F.CrtYd") (width 0.05) (tstamp 859a31f8-db02-486a-853d-d25377b9bf58)) 28 | (fp_line (start -2.999301 -1.9558) (end -2.999301 1.9558) (layer "F.CrtYd") (width 0.05) (tstamp b95d4e8a-15a3-4117-b31e-498cbfb724ac)) 29 | (fp_line (start 2.999301 1.9558) (end 2.999301 -1.9558) (layer "F.CrtYd") (width 0.05) (tstamp c1ef19ba-8538-4981-b67b-f636ad0e9570)) 30 | (fp_line (start 2.999301 1.9558) (end 2.999301 -1.9558) (layer "F.CrtYd") (width 0.05) (tstamp d4bab7c6-2161-4382-8a58-3d76ec75c61f)) 31 | (fp_line (start -2.999301 1.9558) (end 2.999301 1.9558) (layer "F.CrtYd") (width 0.05) (tstamp ec0a078c-d744-46ff-aa3e-3e6b01cc996e)) 32 | (fp_line (start 2.999301 -1.9558) (end -2.999301 -1.9558) (layer "F.CrtYd") (width 0.05) (tstamp fad39acb-ec6d-4a93-b841-42f1c0dfdb7f)) 33 | (fp_line (start -2.1971 -1.7018) (end -2.1971 1.7018) (layer "F.Fab") (width 0.1) (tstamp 1d62df3f-2fc2-4da9-ba7d-d46798cfdd68)) 34 | (fp_line (start 2.1971 1.7018) (end 2.1971 -1.7018) (layer "F.Fab") (width 0.1) (tstamp be030f19-cb88-4059-a0f9-3ba3b71af572)) 35 | (fp_line (start -2.1971 1.7018) (end 2.1971 1.7018) (layer "F.Fab") (width 0.1) (tstamp ca058d08-6af9-4e10-bd16-633f732ab4d5)) 36 | (fp_line (start 2.1971 -1.7018) (end -2.1971 -1.7018) (layer "F.Fab") (width 0.1) (tstamp ef0f1647-f274-4e54-b2bb-86418b7a8562)) 37 | (pad "1" smd rect (at -2.250001 -1.074999) (size 0.9906 0.7112) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 2c29bedc-0d1c-4e68-8a52-f27a0c584f03)) 38 | (pad "2" smd rect (at 2.250001 -1.074999) (size 0.9906 0.7112) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 3432249d-e0e0-4382-879d-8bad530357a4)) 39 | (pad "3" smd rect (at -2.250001 1.074999) (size 0.9906 0.7112) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp d7f0f309-e119-4260-99f9-c5f747aef906)) 40 | (pad "4" smd rect (at 2.250001 1.074999) (size 0.9906 0.7112) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 0f6194db-4d30-4e4c-9ed1-1a736f7ba634)) 41 | (model "${KIPRJMOD}/PTS815/PTS815SJM250.stp" 42 | (offset (xyz 0 0 0)) 43 | (scale (xyz 1 1 1)) 44 | (rotate (xyz 0 0 90)) 45 | ) 46 | ) 47 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/components/RP-Pico Libraries/MCU_RaspberryPi_and_Boards.pretty/Crystal_SMD_HC49-US.kicad_mod: -------------------------------------------------------------------------------- 1 | (module Crystal_SMD_HC49-US (layer F.Cu) (tedit 5F0C7995) 2 | (descr "SMD Crystal HC-49-SD http://cdn-reichelt.de/documents/datenblatt/B400/xxx-HC49-SMD.pdf, 11.4x4.7mm^2 package") 3 | (tags "SMD SMT crystal") 4 | (attr smd) 5 | (fp_text reference Y1 (at 0 -3.55) (layer F.SilkS) 6 | (effects (font (size 1 1) (thickness 0.15))) 7 | ) 8 | (fp_text value ABLS-12.000MHZ-B4-T (at 0 3.55) (layer F.Fab) 9 | (effects (font (size 1 1) (thickness 0.15))) 10 | ) 11 | (fp_line (start -6.7 1.3) (end -6.7 2.55) (layer F.SilkS) (width 0.12)) 12 | (fp_text user %R (at 0 0) (layer F.Fab) 13 | (effects (font (size 1 1) (thickness 0.15))) 14 | ) 15 | (fp_line (start -5.7 -2.35) (end -5.7 2.35) (layer F.Fab) (width 0.1)) 16 | (fp_line (start -5.7 2.35) (end 5.7 2.35) (layer F.Fab) (width 0.1)) 17 | (fp_line (start 5.7 2.35) (end 5.7 -2.35) (layer F.Fab) (width 0.1)) 18 | (fp_line (start 5.7 -2.35) (end -5.7 -2.35) (layer F.Fab) (width 0.1)) 19 | (fp_line (start -3.015 -2.115) (end 3.015 -2.115) (layer F.Fab) (width 0.1)) 20 | (fp_line (start -3.015 2.115) (end 3.015 2.115) (layer F.Fab) (width 0.1)) 21 | (fp_line (start 5.9 -2.55) (end -6.7 -2.55) (layer F.SilkS) (width 0.12)) 22 | (fp_line (start -6.7 -2.55) (end -6.7 -1.3) (layer F.SilkS) (width 0.12)) 23 | (fp_line (start -6.7 2.55) (end 5.9 2.55) (layer F.SilkS) (width 0.12)) 24 | (fp_line (start -6.8 -2.6) (end -6.8 2.6) (layer F.CrtYd) (width 0.05)) 25 | (fp_line (start -6.8 2.6) (end 6.8 2.6) (layer F.CrtYd) (width 0.05)) 26 | (fp_line (start 6.8 2.6) (end 6.8 -2.6) (layer F.CrtYd) (width 0.05)) 27 | (fp_line (start 6.8 -2.6) (end -6.8 -2.6) (layer F.CrtYd) (width 0.05)) 28 | (fp_arc (start -3.015 0) (end -3.015 -2.115) (angle -180) (layer F.Fab) (width 0.1)) 29 | (fp_arc (start 3.015 0) (end 3.015 -2.115) (angle 180) (layer F.Fab) (width 0.1)) 30 | (pad 1 smd rect (at -4.5 0) (size 5.6 2.1) (layers F.Cu F.Paste F.Mask)) 31 | (pad 2 smd rect (at 4.5 0) (size 5.6 2.1) (layers F.Cu F.Paste F.Mask)) 32 | (model ${KISYS3DMOD}/Crystal.3dshapes/Crystal_SMD_HC49-SD.wrl 33 | (at (xyz 0 0 0)) 34 | (scale (xyz 1 1 1)) 35 | (rotate (xyz 0 0 0)) 36 | ) 37 | ) 38 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/components/SK6812-multi.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "SK6812-multi" (version 20211014) (generator pcbnew) 2 | (layer "F.Cu") 3 | (tedit 0) 4 | (attr smd) 5 | (fp_text reference "REF**" (at 0 0.5 180 unlocked) (layer "F.SilkS") 6 | (effects (font (size 1 1) (thickness 0.15))) 7 | (tstamp 90bb86c4-7fee-4f8b-8d57-d07875e24f1a) 8 | ) 9 | (fp_text value "SK6812-multi" (at 0 3.9864 unlocked) (layer "F.Fab") 10 | (effects (font (size 1 1) (thickness 0.15))) 11 | (tstamp 15d8f122-ce4b-462e-b1ca-6fd04cb3916b) 12 | ) 13 | (fp_text user "${REFERENCE}" (at 0 0 180) (layer "F.Fab") 14 | (effects (font (size 0.8 0.8) (thickness 0.15))) 15 | (tstamp 23bfb527-defc-4f78-95e9-7f74579c09a4) 16 | ) 17 | (fp_text user "${REFERENCE}" (at 0 5.4864 unlocked) (layer "F.Fab") 18 | (effects (font (size 1 1) (thickness 0.15))) 19 | (tstamp 350820a1-d5c3-4e2e-be4c-82d8fae5e85e) 20 | ) 21 | (fp_line (start -3.65 -2.75) (end -3.65 -1.6) (layer "F.SilkS") (width 0.12) (tstamp 1881ea2c-2560-49cc-b7f1-022c8a4385bb)) 22 | (fp_line (start 3.65 2.75) (end -3.65 2.75) (layer "F.SilkS") (width 0.12) (tstamp 32c598df-5d9b-4fee-8d9e-5dcedfec77c5)) 23 | (fp_line (start 3.65 -2.75) (end -3.65 -2.75) (layer "F.SilkS") (width 0.12) (tstamp c68472cb-b009-44ae-940b-4d058062be07)) 24 | (fp_line (start -3.45 2.75) (end 3.45 2.75) (layer "F.CrtYd") (width 0.05) (tstamp 5fbba351-3a1e-4a26-91e2-356565871f20)) 25 | (fp_line (start 3.45 -2.75) (end -3.45 -2.75) (layer "F.CrtYd") (width 0.05) (tstamp 8d814b34-1ed6-409a-ac2e-04ce8fdf0288)) 26 | (fp_line (start 3.45 2.75) (end 3.45 -2.75) (layer "F.CrtYd") (width 0.05) (tstamp c1f4c6f1-d46e-49f4-b09a-5a44dc833757)) 27 | (fp_line (start -3.45 -2.75) (end -3.45 2.75) (layer "F.CrtYd") (width 0.05) (tstamp dfbbdba7-6ac4-48d9-9273-fb26ec743c86)) 28 | (fp_line (start -2.5 -2.5) (end -2.5 2.5) (layer "F.Fab") (width 0.1) (tstamp 0c56838c-bfca-4e17-90db-5c83ad6191e4)) 29 | (fp_line (start -2.5 2.5) (end 2.5 2.5) (layer "F.Fab") (width 0.1) (tstamp 11380e4c-644e-403a-abed-46e7a8ccb89b)) 30 | (fp_line (start -2.5 -1.5) (end -1.5 -2.5) (layer "F.Fab") (width 0.1) (tstamp 128e9895-09f6-495c-85f8-ac2d44065e95)) 31 | (fp_line (start 2.5 2.5) (end 2.5 -2.5) (layer "F.Fab") (width 0.1) (tstamp 6b200a56-ec94-4ba9-b582-dd59ff190716)) 32 | (fp_line (start 2.5 -2.5) (end -2.5 -2.5) (layer "F.Fab") (width 0.1) (tstamp d04f1673-b4c9-4a0b-b7f0-c7f8880f4ec0)) 33 | (fp_circle (center 0 0) (end 0 2) (layer "F.Fab") (width 0.1) (fill none) (tstamp b59e44aa-893d-44d1-847b-556851f2914a)) 34 | (pad "1" smd rect (at -1 -0.65) (size 1 0.6) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 5ddd9f86-7dc8-499a-a55b-6bc8105fd324)) 35 | (pad "1" smd rect (at -2.45 -1.6 180) (size 1.5 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 600e835a-0301-48ef-b00e-73b920c34935)) 36 | (pad "1" smd rect (at -1.75 -0.875) (size 1.6 0.85) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp f95a7381-960f-45dd-95e2-08e9666acab1)) 37 | (pad "2" smd rect (at -1 0.65) (size 1 0.6) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 7a5c3c6a-9ebd-4ade-92c7-b69461a558f8)) 38 | (pad "2" smd rect (at -1.75 0.875) (size 1.6 0.85) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp ee1a616a-4a7b-445f-a865-89143f437eb2)) 39 | (pad "2" smd rect (at -2.45 1.6 180) (size 1.5 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp ff25bd4a-a67e-45f4-a712-9f4aaef80aa4)) 40 | (pad "3" smd rect (at 2.45 1.6 180) (size 1.5 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 0c3f3aa5-c0fb-4849-93f1-88e01051ebf7)) 41 | (pad "3" smd rect (at 1.75 0.875) (size 1.6 0.85) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 6374ea98-4d1d-4096-a758-c0852a0d4bf6)) 42 | (pad "3" smd rect (at 1 0.65) (size 1 0.6) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 73ade465-b807-4cc3-a734-12faa5c9e659)) 43 | (pad "4" smd rect (at 1 -0.65) (size 1 0.6) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 92abf468-d1fb-41d5-bf63-9be2460ac753)) 44 | (pad "4" smd rect (at 2.45 -1.6 180) (size 1.5 1) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp a785b1ac-f55e-4ec3-a5ee-de66760e3804)) 45 | (pad "4" smd rect (at 1.75 -0.875) (size 1.6 0.85) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp ea4f21fb-590f-4f3f-85d5-7833f3ed1dab)) 46 | (model "${KICAD6_3DMODEL_DIR}/LED_SMD.3dshapes/LED_WS2812B_PLCC4_5.0x5.0mm_P3.2mm.step" 47 | (offset (xyz 0 0 1)) 48 | (scale (xyz 1 1 1)) 49 | (rotate (xyz 0 0 180)) 50 | ) 51 | ) 52 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/components/Waveshare-RP2040-Plus/PTS815/PTS815.kicad_sym: -------------------------------------------------------------------------------- 1 | (kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor) 2 | (symbol "PTS815_SJM_250_SMTR_LFS" (pin_names (offset 0.254)) (in_bom yes) (on_board yes) 3 | (property "Reference" "SW" (id 0) (at 0 10.16 0) 4 | (effects (font (size 1.524 1.524))) 5 | ) 6 | (property "Value" "PTS815_SJM_250_SMTR_LFS" (id 1) (at 0 7.62 0) 7 | (effects (font (size 1.524 1.524))) 8 | ) 9 | (property "Footprint" "PTS815 SJM 250 SMTR LFS_CNK" (id 2) (at 0 6.096 0) 10 | (effects (font (size 1.524 1.524)) hide) 11 | ) 12 | (property "Datasheet" "" (id 3) (at -40.64 2.54 0) 13 | (effects (font (size 1.524 1.524))) 14 | ) 15 | (property "ki_locked" "" (id 4) (at 0 0 0) 16 | (effects (font (size 1.27 1.27))) 17 | ) 18 | (property "ki_fp_filters" "SW4_PTS815" (id 5) (at 0 0 0) 19 | (effects (font (size 1.27 1.27)) hide) 20 | ) 21 | (symbol "PTS815_SJM_250_SMTR_LFS_0_1" 22 | (pin passive line (at -5.08 2.54 0) (length 2.54) 23 | (name "1" (effects (font (size 1.27 1.27)))) 24 | (number "1" (effects (font (size 1.27 1.27)))) 25 | ) 26 | (pin passive line (at 5.08 2.54 180) (length 2.54) 27 | (name "2" (effects (font (size 1.27 1.27)))) 28 | (number "2" (effects (font (size 1.27 1.27)))) 29 | ) 30 | (pin passive line (at -5.08 -2.54 0) (length 2.54) 31 | (name "3" (effects (font (size 1.27 1.27)))) 32 | (number "3" (effects (font (size 1.27 1.27)))) 33 | ) 34 | (pin passive line (at 5.08 -2.54 180) (length 2.54) 35 | (name "4" (effects (font (size 1.27 1.27)))) 36 | (number "4" (effects (font (size 1.27 1.27)))) 37 | ) 38 | ) 39 | (symbol "PTS815_SJM_250_SMTR_LFS_1_1" 40 | (circle (center 0 -1.27) (radius 0.127) 41 | (stroke (width 0.508) (type default) (color 0 0 0 0)) 42 | (fill (type none)) 43 | ) 44 | (polyline 45 | (pts 46 | (xy -2.54 -2.54) 47 | (xy 2.54 -2.54) 48 | ) 49 | (stroke (width 0) (type default) (color 0 0 0 0)) 50 | (fill (type none)) 51 | ) 52 | (polyline 53 | (pts 54 | (xy -1.27 -1.27) 55 | (xy 0 1.27) 56 | ) 57 | (stroke (width 0.127) (type default) (color 0 0 0 0)) 58 | (fill (type none)) 59 | ) 60 | (polyline 61 | (pts 62 | (xy 0 -1.27) 63 | (xy 0 -2.54) 64 | ) 65 | (stroke (width 0.127) (type default) (color 0 0 0 0)) 66 | (fill (type none)) 67 | ) 68 | (polyline 69 | (pts 70 | (xy 0 1.27) 71 | (xy 0 2.54) 72 | ) 73 | (stroke (width 0.127) (type default) (color 0 0 0 0)) 74 | (fill (type none)) 75 | ) 76 | (polyline 77 | (pts 78 | (xy 2.54 2.54) 79 | (xy -2.54 2.54) 80 | ) 81 | (stroke (width 0) (type default) (color 0 0 0 0)) 82 | (fill (type none)) 83 | ) 84 | (circle (center 0 1.27) (radius 0.127) 85 | (stroke (width 0.508) (type default) (color 0 0 0 0)) 86 | (fill (type none)) 87 | ) 88 | ) 89 | ) 90 | ) 91 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/components/Waveshare-RP2040-Plus/PTS815/PTS815.pretty/PTS815 SJM 250 SMTR LFS.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "PTS815 SJM 250 SMTR LFS" (version 20211014) (generator pcbnew) 2 | (layer "F.Cu") 3 | (tedit 0) 4 | (attr smd) 5 | (fp_text reference "REF**" (at 0 0) (layer "F.SilkS") 6 | (effects (font (size 1 1) (thickness 0.15))) 7 | (tstamp 1dcacadc-de22-4ea6-9f8a-d23eda644c4e) 8 | ) 9 | (fp_text value "SW4_PTS815_SJM_250_SMTR_LFS_CNK" (at 0 0) (layer "F.SilkS") 10 | (effects (font (size 1 1) (thickness 0.15))) 11 | (tstamp e1463d01-3e0a-4131-90a2-bd2050c57359) 12 | ) 13 | (fp_text user "*" (at 0 0) (layer "F.SilkS") 14 | (effects (font (size 1 1) (thickness 0.15))) 15 | (tstamp 37db6bfb-b2df-44ed-8394-d065e1dd64c9) 16 | ) 17 | (fp_text user "*" (at 0 0) (layer "F.Fab") 18 | (effects (font (size 1 1) (thickness 0.15))) 19 | (tstamp fb0e7c76-1a70-4dc7-bc6c-e0105f5ca3aa) 20 | ) 21 | (fp_line (start 2.3241 0.386659) (end 2.3241 -0.386659) (layer "F.SilkS") (width 0.12) (tstamp 19e5637d-6cd0-4598-8c26-30a6e06d8be7)) 22 | (fp_line (start 2.3241 -1.8288) (end -2.3241 -1.8288) (layer "F.SilkS") (width 0.12) (tstamp 775ca73b-dace-4708-b6d6-8fb7075f2cef)) 23 | (fp_line (start -2.3241 1.8288) (end 2.3241 1.8288) (layer "F.SilkS") (width 0.12) (tstamp e467ca4b-4903-4e7a-b62d-c263e63ad495)) 24 | (fp_line (start -2.3241 -0.386659) (end -2.3241 0.386659) (layer "F.SilkS") (width 0.12) (tstamp ef09a926-c701-462c-a7a2-8867d47e2bf0)) 25 | (fp_line (start 2.999301 -1.9558) (end -2.999301 -1.9558) (layer "F.CrtYd") (width 0.05) (tstamp 06e0f363-ac46-4fb6-8fa3-86d549e0309d)) 26 | (fp_line (start -2.999301 -1.9558) (end -2.999301 1.9558) (layer "F.CrtYd") (width 0.05) (tstamp 3b6ae67e-1a06-4585-9b19-8b8daa22189c)) 27 | (fp_line (start -2.999301 1.9558) (end 2.999301 1.9558) (layer "F.CrtYd") (width 0.05) (tstamp 859a31f8-db02-486a-853d-d25377b9bf58)) 28 | (fp_line (start -2.999301 -1.9558) (end -2.999301 1.9558) (layer "F.CrtYd") (width 0.05) (tstamp b95d4e8a-15a3-4117-b31e-498cbfb724ac)) 29 | (fp_line (start 2.999301 1.9558) (end 2.999301 -1.9558) (layer "F.CrtYd") (width 0.05) (tstamp c1ef19ba-8538-4981-b67b-f636ad0e9570)) 30 | (fp_line (start 2.999301 1.9558) (end 2.999301 -1.9558) (layer "F.CrtYd") (width 0.05) (tstamp d4bab7c6-2161-4382-8a58-3d76ec75c61f)) 31 | (fp_line (start -2.999301 1.9558) (end 2.999301 1.9558) (layer "F.CrtYd") (width 0.05) (tstamp ec0a078c-d744-46ff-aa3e-3e6b01cc996e)) 32 | (fp_line (start 2.999301 -1.9558) (end -2.999301 -1.9558) (layer "F.CrtYd") (width 0.05) (tstamp fad39acb-ec6d-4a93-b841-42f1c0dfdb7f)) 33 | (fp_line (start -2.1971 -1.7018) (end -2.1971 1.7018) (layer "F.Fab") (width 0.1) (tstamp 1d62df3f-2fc2-4da9-ba7d-d46798cfdd68)) 34 | (fp_line (start 2.1971 1.7018) (end 2.1971 -1.7018) (layer "F.Fab") (width 0.1) (tstamp be030f19-cb88-4059-a0f9-3ba3b71af572)) 35 | (fp_line (start -2.1971 1.7018) (end 2.1971 1.7018) (layer "F.Fab") (width 0.1) (tstamp ca058d08-6af9-4e10-bd16-633f732ab4d5)) 36 | (fp_line (start 2.1971 -1.7018) (end -2.1971 -1.7018) (layer "F.Fab") (width 0.1) (tstamp ef0f1647-f274-4e54-b2bb-86418b7a8562)) 37 | (pad "1" smd rect (at -2.250001 -1.074999) (size 0.9906 0.7112) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 2c29bedc-0d1c-4e68-8a52-f27a0c584f03)) 38 | (pad "2" smd rect (at 2.250001 -1.074999) (size 0.9906 0.7112) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 3432249d-e0e0-4382-879d-8bad530357a4)) 39 | (pad "3" smd rect (at -2.250001 1.074999) (size 0.9906 0.7112) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp d7f0f309-e119-4260-99f9-c5f747aef906)) 40 | (pad "4" smd rect (at 2.250001 1.074999) (size 0.9906 0.7112) (layers "F.Cu" "F.Paste" "F.Mask") (tstamp 0f6194db-4d30-4e4c-9ed1-1a736f7ba634)) 41 | (model "${KIPRJMOD}/PTS815/PTS815SJM250.stp" 42 | (offset (xyz 0 0 0)) 43 | (scale (xyz 1 1 1)) 44 | (rotate (xyz 0 0 90)) 45 | ) 46 | ) 47 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/components/Waveshare-RP2040-Plus/Waveshare-RP2040-Plus.kicad_sch: -------------------------------------------------------------------------------- 1 | (kicad_sch (version 20211123) (generator eeschema) 2 | 3 | (uuid 36aef479-38b1-413a-8933-07af016b669d) 4 | 5 | (paper "A4") 6 | 7 | (lib_symbols 8 | ) 9 | 10 | 11 | (text "The only purpose of this project is to generate \na visually appealing 3D model of the \nWaveshare RP2040-Plus module.\n\nhttps://www.waveshare.com/wiki/RP2040-Plus" 12 | (at 62.23 113.03 0) 13 | (effects (font (size 5 5)) (justify left bottom)) 14 | (uuid a4fdaecf-6425-400a-9641-39f42a748307) 15 | ) 16 | 17 | (sheet_instances 18 | (path "/" (page "1")) 19 | ) 20 | ) 21 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/components/espressif-kicad-libraries/.gitignore: -------------------------------------------------------------------------------- 1 | # For PCBs designed using KiCad: http://www.kicad-pcb.org/ 2 | # Format documentation: http://kicad-pcb.org/help/file-formats/ 3 | 4 | # Temporary files 5 | *.000 6 | *.bak 7 | *.bck 8 | *.kicad_pcb-bak 9 | *.kicad_sch-bak 10 | *.kicad_prl 11 | *.sch-bak 12 | *~ 13 | _autosave-* 14 | *.tmp 15 | *-save.pro 16 | *-save.kicad_pcb 17 | fp-info-cache 18 | 19 | # Netlist files (exported from Eeschema) 20 | *.net 21 | 22 | # Autorouter files (exported from Pcbnew) 23 | *.dsn 24 | *.ses 25 | 26 | # Exported BOM files 27 | *.xml 28 | *.csv -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/components/espressif-kicad-libraries/3d/ESP32-C3-MINI-1.STEP: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/hardware-designs/DemoBadge/components/espressif-kicad-libraries/3d/ESP32-C3-MINI-1.STEP -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/components/espressif-kicad-libraries/3d/ESP32-C3-MINI-1.wrl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/hardware-designs/DemoBadge/components/espressif-kicad-libraries/3d/ESP32-C3-MINI-1.wrl -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/components/espressif-kicad-libraries/LICENSE.md: -------------------------------------------------------------------------------- 1 | ### KiCad Libraries License 2 | 3 | The libraries provided in this repository are licensed under the [Creative Commons CC-BY-SA 4.0 License](https://creativecommons.org/licenses/by-sa/4.0/legalcode), with the following exception: 4 | 5 | --------- 6 | 7 | _To the extent that the creation of electronic designs that use 'Licensed Material' can be considered to be 'Adapted Material', then the copyright holder waives article 3 of the license with respect to these designs and any generated files which use data provided as part of the 'Licensed Material'._ 8 | 9 | These are the same license conditions as those used by KiCad project for the official libraries: https://www.kicad.org/libraries/license/. 10 | 11 | --------- 12 | 13 | **Warranty** 14 | 15 | The libraries are provided in the hope that they will be useful, but are provided without warranty of any kind, express or implied. 16 | 17 | The KiCad libraries are compiled by the KiCad community - if you find an error in the library data, please help the community and contribute a fix! -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/components/espressif-kicad-libraries/README.md: -------------------------------------------------------------------------------- 1 | # Espressif KiCad Library 2 | 3 | This repository contains the Symbols, Footprint, and 3D Models for the Espressif SoC and Modules family. 4 | 5 | 6 | ![Library Downloads](https://img.shields.io/github/downloads/espressif/kicad-libraries/total?style=flat-square) 7 | 8 | > Notice: The libraries are provided in the hope that they will be useful but without a warranty of any kind. 9 | 10 | **The libraries in this repository are intended to be used with KiCad version 6.** 11 | 12 | Each footprint library is stored as a directory with the .pretty suffix. The footprint files are .kicad_mod files within. 13 | 14 | ## Hardware Design Guidelines 15 | 16 | Before designing your own hardware, be sure to check all recommendations at: 17 | 18 | [Espressif Hardware Design Guidelines](https://www.espressif.com/sites/default/files/documentation/esp32_hardware_design_guidelines_en.pdf) 19 | 20 | ## Symbols and Footprints 21 | 22 | All footprints were designed according to the Recommended PCB Land Pattern section present on each module datasheet. 23 | 24 | ### SoC 25 | 26 | The following SoC are included in this library 27 | 28 | | SoC | Symbol | Footprint | Resource | 29 | |:------------:|:------:|:---------:|:------------------------------------------------------------------------------------------------------:| 30 | |ESP32 |Yes |No |[Datasheet](https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf) | 31 | |ESP32-C3 |Yes |No |[Datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-c3_datasheet_en.pdf) | 32 | |ESP32-PICO-V3 |Yes |No |[Datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-pico-v3_datasheet_en.pdf) | 33 | |ESP32-S2 |Yes |No |[Datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-s2_datasheet_en.pdf) | 34 | |ESP32-S3 |Yes |No |[Datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-s3_datasheet_en.pdf) | 35 | |ESP8286 |Yes |No |[Datasheet](https://www.espressif.com/sites/default/files/documentation/0a-esp8266ex_datasheet_en.pdf) | 36 | |ESP8285 |Yes |No |[Datasheet](https://www.espressif.com/sites/default/files/documentation/0a-esp8285_datasheet_en.pdf) | 37 | 38 | ### Modules 39 | 40 | | Module | Symbol | Footprint | Resource | 41 | |:----------------:|:------:|:---------:|:---------------------------------------------------------------------------------------------------------------------------:| 42 | |ESP32-C3-MINI-1 |Yes |Yes |[Datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-c3-mini-1_datasheet_en.pdf) | 43 | |ESP32-C3-WROOM-02 |Yes |Yes |[Datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-c3-wroom-02_datasheet_en.pdf) | 44 | |ESP32-S2-MINI-1 |Yes |Yes |[Datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-s2-mini-1_esp32-s2-mini-1u_datasheet_en.pdf) | 45 | |ESP32-S2-MINI-1U |Yes |Yes |[Datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-s2-mini-1_esp32-s2-mini-1u_datasheet_en.pdf) | 46 | |ESP32-S2-SOLO |Yes |Yes |[Datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-s2-solo_esp32-s2-solo-u_datasheet_en.pdf) | 47 | |ESP32-S2-WROOM |Yes |Yes |[Datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-s2-wroom_esp32-s2-wroom-i_datasheet_en.pdf) | 48 | |ESP32-S2-WROVER |Yes |Yes |[Datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-s2-wrover_esp32-s2-wrover-i_datasheet_en.pdf) | 49 | |ESP32-S3-MINI-1 |Yes |Yes |[Datasheet](https://products.espressif.com/) | 50 | |ESP32-S3-MINI-1U |Yes |Yes |[Datasheet](https://products.espressif.com/) | 51 | |ESP32-S3-WROOM-1 |Yes |Yes |[Datasheet](https://products.espressif.com/) | 52 | |ESP32-S3-WROOM-1U |Yes |Yes |[Datasheet](https://products.espressif.com/) | 53 | |ESP32-WROOM-32E |Yes |Yes |[Datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-wroom-32e_esp32-wroom-32ue_datasheet_en.pdf) | 54 | |ESP32-WROOM-32UE |Yes |Yes |[Datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-wroom-32e_esp32-wroom-32ue_datasheet_en.pdf) | 55 | |ESP32-WROVER-E |Yes |Yes |[Datasheet](https://www.espressif.com/sites/default/files/documentation/esp32-wrover-e_esp32-wrover-ie_datasheet_en.pdf) | 56 | 57 | ### Development Boards 58 | 59 | | Dev Board | Symbol | Footprint | Resource | 60 | | :--------------: | :----: | :-------: | :----------------------------------------------------------: | 61 | | ESP32-S2-Saola-1 | Yes | Yes | [Schematic](https://dl.espressif.com/dl/schematics/ESP32-S2-SAOLA-1_V1.1_schematics.pdf) | 62 | | ESP32-DevKitC | Yes | Yes | [Schematic](https://dl.espressif.com/dl/schematics/esp32_devkitc_v4-sch.pdf) | 63 | | ESP32-S3-DevKitC | Yes | Yes | | 64 | | ESP32-S2-DevKitM | Yes | Yes | [Schematic](https://dl.espressif.com/dl/schematics/ESP32-S2-DevKitM-1_V1_Schematics.pdf) | 65 | 66 | ### Contributing 67 | 68 | If you want to contribute, please consider sending us a Pull Request (PR). 69 | 70 | ### 3D Models 71 | 72 | Espressif provides some 3D models to help you with your project inside the ``3d`` folder. 73 | To use the files, you need to create an environment variable add the ``3d`` folder path. 74 | 75 | * Open ``Open Preferences`` -> ``Configure Paths...`` 76 | * Create the new variable: 77 | * Name: ``ESPRESSIF_3DMODELS`` 78 | * Path: ```` 79 | 80 | ### About KiCad 81 | 82 | KiCad is a Cross-Platform and Open Source Electronics Design Automation Suite. See [KiCad EDA](https://kicad.org/) for more information. 83 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/components/lanyard-cutout.kicad_mod: -------------------------------------------------------------------------------- 1 | (footprint "lanyard-cutout" (version 20211014) (generator pcbnew) 2 | (layer "F.Cu") 3 | (tedit 0) 4 | (fp_text reference "REF**" (at 0 -0.5 unlocked) (layer "F.SilkS") hide 5 | (effects (font (size 1 1) (thickness 0.15))) 6 | (tstamp 151a48c0-cd55-4a83-9fe8-77871f5bd945) 7 | ) 8 | (fp_text value "lanyard-cutout" (at 0 0 unlocked) (layer "F.Fab") 9 | (effects (font (size 1 1) (thickness 0.15))) 10 | (tstamp 40c3716b-a77e-47a4-8661-cf590819d86f) 11 | ) 12 | (fp_text user "${REFERENCE}" (at 0 2.5 unlocked) (layer "F.Fab") hide 13 | (effects (font (size 1 1) (thickness 0.15))) 14 | (tstamp a4a58eb8-690d-4c65-9f9e-dc685c69e2af) 15 | ) 16 | (fp_line (start 7.5 -1.25) (end -7.5 -1.25) (layer "Edge.Cuts") (width 0.1) (tstamp 4d000846-7f56-464e-b69e-64839e8df862)) 17 | (fp_line (start -7.5 1.25) (end 7.5 1.25) (layer "Edge.Cuts") (width 0.1) (tstamp a304b2a3-002a-42bc-800e-a2934cb7886a)) 18 | (fp_arc (start 7.5 -1.25) (mid 8.75 0) (end 7.5 1.25) (layer "Edge.Cuts") (width 0.1) (tstamp 40fd452c-2e23-48ec-bf2e-cb3b80dd87fd)) 19 | (fp_arc (start -7.5 1.25) (mid -8.736979 0) (end -7.5 -1.25) (layer "Edge.Cuts") (width 0.1) (tstamp 825dba1a-088d-4129-bd18-f8539838bc31)) 20 | ) 21 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/demo-badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/hardware-designs/DemoBadge/demo-badge.png -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/fp-lib-table: -------------------------------------------------------------------------------- 1 | (fp_lib_table 2 | (lib (name "aws-iot-expresslink-demo-badge")(type "KiCad")(uri "${KIPRJMOD}/")(options "")(descr "")) 3 | (lib (name "MCU_RaspberryPi_and_Boards")(type "KiCad")(uri "${KIPRJMOD}/components/RP-Pico Libraries/MCU_RaspberryPi_and_Boards.pretty")(options "")(descr "")) 4 | (lib (name "Espressif")(type "KiCad")(uri "${KIPRJMOD}/components/espressif-kicad-libraries/footprints/Espressif.pretty")(options "")(descr "")) 5 | (lib (name "ER-TFT013-2")(type "KiCad")(uri "${KIPRJMOD}/components/ER-TFT013-2/ER-TFT013-2.pretty")(options "")(descr "")) 6 | (lib (name "NT3H2211W0FHKH")(type "KiCad")(uri "${KIPRJMOD}/components/NT3H2211W0FHKH/NT3H2211W0FHKH.pretty")(options "")(descr "")) 7 | (lib (name "PTS815")(type "KiCad")(uri "${KIPRJMOD}/components/PTS815/PTS815.pretty")(options "")(descr "")) 8 | (lib (name "JS2020")(type "KiCad")(uri "${KIPRJMOD}/components/JS2020/JS2020.pretty")(options "")(descr "")) 9 | (lib (name "IN-S32GTLS")(type "KiCad")(uri "${KIPRJMOD}/components/IN-S32GTLS/IN-S32GTLS.pretty")(options "")(descr "")) 10 | (lib (name "ALS-PT19-315C_L177_TR8")(type "KiCad")(uri "${KIPRJMOD}/components/ALS-PT19-315C_L177_TR8")(options "")(descr "")) 11 | ) 12 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/kibot.yaml: -------------------------------------------------------------------------------- 1 | kibot: 2 | version: 1 3 | 4 | global: 5 | filters: 6 | - number: 1007 7 | - number: 1015 8 | - number: 58 9 | dir: Generated 10 | 11 | filters: 12 | - name: only_jlc_parts 13 | comment: Only parts with JLC (LCSC) code 14 | type: generic 15 | include_only: 16 | - column: LCSC# 17 | regex: ^C\d+ 18 | - name: fix_rotation 19 | comment: 'Adjust rotation for JLC' 20 | type: rot_footprint 21 | rotations: 22 | - ["^SOT-23", 0.0] 23 | # - ["^SK6812", 180.0] # SK6812 is 180deg to WS2812. JLCPCB only has WS2812 in stock. DO NOT uncomment unless you populate with SK6812. 24 | - ["^Sensirion_DFN-8", -90.0] 25 | - ["^IC_NT3H2211W0FHKH", 180.0] 26 | 27 | variants: 28 | - name: jlcpcb 29 | comment: 'JLCPCB requires some rotational transforms' 30 | type: kibom 31 | variant: jlcpcb 32 | pre_transform: fix_rotation 33 | 34 | outputs: 35 | - name: basic_pdf_sch_print 36 | comment: Schematic in PDF format 37 | type: pdf_sch_print 38 | dir: +/Schematic 39 | 40 | - name: JLCPCB_gerbers 41 | comment: Gerbers compatible with JLCPCB 42 | type: gerber 43 | dir: +/Manufacturers/JLCPCB 44 | options: 45 | exclude_edge_layer: true 46 | exclude_pads_from_silkscreen: true 47 | plot_sheet_reference: false 48 | plot_footprint_refs: true 49 | plot_footprint_values: false 50 | force_plot_invisible_refs_vals: false 51 | tent_vias: true 52 | use_protel_extensions: true 53 | create_gerber_job_file: false 54 | disable_aperture_macros: true 55 | gerber_precision: 4.6 56 | use_gerber_x2_attributes: false 57 | use_gerber_net_attributes: false 58 | line_width: 0.1 59 | subtract_mask_from_silk: true 60 | inner_extension_pattern: .gp%n 61 | layers: &id002 62 | - layer: F.Cu 63 | suffix: F_Cu 64 | description: Front copper 65 | - layer: B.Cu 66 | suffix: B_Cu 67 | description: Bottom copper 68 | - layer: B.Paste 69 | suffix: B_Paste 70 | description: Bottom solder paste 71 | - layer: F.Paste 72 | suffix: F_Paste 73 | description: Front solder paste 74 | - layer: B.Silkscreen 75 | suffix: B_Silkscreen 76 | description: Bottom silkscreen (artwork) 77 | - layer: F.Silkscreen 78 | suffix: F_Silkscreen 79 | description: Front silkscreen (artwork) 80 | - layer: B.Mask 81 | suffix: B_Mask 82 | description: Bottom soldermask (negative) 83 | - layer: F.Mask 84 | suffix: F_Mask 85 | description: Front soldermask (negative) 86 | - layer: Edge.Cuts 87 | suffix: Edge_Cuts 88 | description: Board shape 89 | - name: JLCPCB_drill 90 | comment: Drill files compatible with JLCPCB 91 | type: excellon 92 | dir: +/Manufacturers/JLCPCB 93 | options: 94 | pth_and_npth_single_file: false 95 | pth_id: -PTH 96 | npth_id: -NPTH 97 | metric_units: true 98 | map: gerber 99 | route_mode_for_oval_holes: false 100 | output: '%f%i.%x' 101 | - name: JLCPCB_position 102 | comment: Pick and place file, JLCPCB style 103 | type: position 104 | dir: +/Manufacturers/JLCPCB 105 | options: 106 | variant: jlcpcb 107 | output: '%f_cpl_jlc.%x' 108 | format: CSV 109 | units: millimeters 110 | separate_files_for_front_and_back: false 111 | only_smd: true 112 | columns: 113 | - id: Ref 114 | name: Designator 115 | - Val 116 | - Package 117 | - id: PosX 118 | name: Mid X 119 | - id: PosY 120 | name: Mid Y 121 | - id: Rot 122 | name: Rotation 123 | - id: Side 124 | name: Layer 125 | - name: JLCPCB_bom 126 | comment: BoM for JLCPCB 127 | type: bom 128 | dir: +/Manufacturers/JLCPCB 129 | options: 130 | output: '%f_%i_jlc.%x' 131 | exclude_filter: only_jlc_parts 132 | ref_separator: ',' 133 | columns: 134 | - field: Value 135 | name: Comment 136 | - field: References 137 | name: Designator 138 | - Footprint 139 | - field: LCSC# 140 | name: 'LCSC Part #' 141 | csv: 142 | hide_pcb_info: true 143 | hide_stats_info: true 144 | quote_all: true 145 | - name: JLCPCB 146 | comment: ZIP file for JLCPCB 147 | type: compress 148 | dir: +/Manufacturers 149 | options: 150 | files: 151 | - from_output: JLCPCB_gerbers 152 | dest: / 153 | - from_output: JLCPCB_drill 154 | dest: / 155 | - from_output: JLCPCB_position 156 | dest: / 157 | - from_output: JLCPCB_bom 158 | dest: / 159 | 160 | - name: basic_step 161 | comment: 3D model in STEP format 162 | type: step 163 | dir: +/3D 164 | 165 | - name: basic_render_3d_top 166 | comment: 3D view from top 167 | type: render_3d 168 | dir: +/3D 169 | options: 170 | zoom: 3 171 | height: 5000 172 | width: 5000 173 | solder_mask: '#101010' 174 | background1: '#ffffff' 175 | background2: '#ffffff' 176 | ray_tracing: true 177 | orthographic: true 178 | - name: basic_render_3d_bottom 179 | comment: 3D view from bottom 180 | type: render_3d 181 | dir: +/3D 182 | options: 183 | zoom: 3 184 | height: 5000 185 | width: 5000 186 | solder_mask: '#101010' 187 | background1: '#ffffff' 188 | background2: '#ffffff' 189 | ray_tracing: true 190 | orthographic: true 191 | view: bottom 192 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/snapshot/Manufacturers/JLCPCB/aws-iot-expresslink-demo-badge--NPTH_map.gbr: -------------------------------------------------------------------------------- 1 | %TF.GenerationSoftware,KiCad,Pcbnew,6.0.7+dfsg-1~bpo11+1*% 2 | %TF.CreationDate,2023-01-24T09:36:58+00:00*% 3 | %TF.ProjectId,aws-iot-expresslink-demo-badge,6177732d-696f-4742-9d65-787072657373,1*% 4 | %TF.SameCoordinates,Original*% 5 | %TF.FileFunction,Drillmap*% 6 | %TF.FilePolarity,Positive*% 7 | %FSLAX45Y45*% 8 | G04 Gerber Fmt 4.5, Leading zero omitted, Abs format (unit mm)* 9 | G04 Created by KiCad (PCBNEW 6.0.7+dfsg-1~bpo11+1) date 2023-01-24 09:36:58* 10 | %MOMM*% 11 | %LPD*% 12 | G01* 13 | G04 APERTURE LIST* 14 | %ADD10C,0.100000*% 15 | %ADD11C,0.200000*% 16 | G04 APERTURE END LIST* 17 | D10* 18 | X13857102Y-8351809D02* 19 | G75* 20 | G03* 21 | X8322177Y-8351809I-2767462J-10977177D01* 22 | G01* 23 | X8128000Y-16781160D02* 24 | G75* 25 | G03* 26 | X8239678Y-16946243I177660J-130D01* 27 | G01* 28 | X14051278Y-8590280D02* 29 | G75* 30 | G03* 31 | X13857102Y-8351809I-245918J-1950D01* 32 | G01* 33 | X14051280Y-8590280D02* 34 | X14051280Y-16781160D01* 35 | X8322178Y-8351810D02* 36 | G75* 37 | G03* 38 | X8128000Y-8590280I51652J-240350D01* 39 | G01* 40 | X8239678Y-16946243D02* 41 | G75* 42 | G03* 43 | X13939602Y-16946243I2849962J10525904D01* 44 | G01* 45 | X13939604Y-16946247D02* 46 | G75* 47 | G03* 48 | X14051280Y-16781160I-67144J165737D01* 49 | G01* 50 | X8128000Y-16781160D02* 51 | X8128000Y-8590280D01* 52 | D11* 53 | X8380619Y-17640720D02* 54 | X8380619Y-17440720D01* 55 | X8428238Y-17440720D01* 56 | X8456810Y-17450243D01* 57 | X8475857Y-17469291D01* 58 | X8485381Y-17488339D01* 59 | X8494905Y-17526434D01* 60 | X8494905Y-17555005D01* 61 | X8485381Y-17593101D01* 62 | X8475857Y-17612148D01* 63 | X8456810Y-17631196D01* 64 | X8428238Y-17640720D01* 65 | X8380619Y-17640720D01* 66 | X8580619Y-17640720D02* 67 | X8580619Y-17507386D01* 68 | X8580619Y-17545481D02* 69 | X8590143Y-17526434D01* 70 | X8599667Y-17516910D01* 71 | X8618714Y-17507386D01* 72 | X8637762Y-17507386D01* 73 | X8704429Y-17640720D02* 74 | X8704429Y-17507386D01* 75 | X8704429Y-17440720D02* 76 | X8694905Y-17450243D01* 77 | X8704429Y-17459767D01* 78 | X8713952Y-17450243D01* 79 | X8704429Y-17440720D01* 80 | X8704429Y-17459767D01* 81 | X8828238Y-17640720D02* 82 | X8809190Y-17631196D01* 83 | X8799667Y-17612148D01* 84 | X8799667Y-17440720D01* 85 | X8933000Y-17640720D02* 86 | X8913952Y-17631196D01* 87 | X8904429Y-17612148D01* 88 | X8904429Y-17440720D01* 89 | X9161571Y-17640720D02* 90 | X9161571Y-17440720D01* 91 | X9228238Y-17583577D01* 92 | X9294905Y-17440720D01* 93 | X9294905Y-17640720D01* 94 | X9475857Y-17640720D02* 95 | X9475857Y-17535958D01* 96 | X9466333Y-17516910D01* 97 | X9447286Y-17507386D01* 98 | X9409190Y-17507386D01* 99 | X9390143Y-17516910D01* 100 | X9475857Y-17631196D02* 101 | X9456810Y-17640720D01* 102 | X9409190Y-17640720D01* 103 | X9390143Y-17631196D01* 104 | X9380619Y-17612148D01* 105 | X9380619Y-17593101D01* 106 | X9390143Y-17574053D01* 107 | X9409190Y-17564529D01* 108 | X9456810Y-17564529D01* 109 | X9475857Y-17555005D01* 110 | X9571095Y-17507386D02* 111 | X9571095Y-17707386D01* 112 | X9571095Y-17516910D02* 113 | X9590143Y-17507386D01* 114 | X9628238Y-17507386D01* 115 | X9647286Y-17516910D01* 116 | X9656810Y-17526434D01* 117 | X9666333Y-17545481D01* 118 | X9666333Y-17602624D01* 119 | X9656810Y-17621672D01* 120 | X9647286Y-17631196D01* 121 | X9628238Y-17640720D01* 122 | X9590143Y-17640720D01* 123 | X9571095Y-17631196D01* 124 | X9752048Y-17621672D02* 125 | X9761571Y-17631196D01* 126 | X9752048Y-17640720D01* 127 | X9742524Y-17631196D01* 128 | X9752048Y-17621672D01* 129 | X9752048Y-17640720D01* 130 | X9752048Y-17516910D02* 131 | X9761571Y-17526434D01* 132 | X9752048Y-17535958D01* 133 | X9742524Y-17526434D01* 134 | X9752048Y-17516910D01* 135 | X9752048Y-17535958D01* 136 | M02* 137 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/snapshot/Manufacturers/JLCPCB/aws-iot-expresslink-demo-badge-Edge_Cuts.gm1: -------------------------------------------------------------------------------- 1 | G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,6.0.7+dfsg-1~bpo11+1* 2 | G04 #@! TF.CreationDate,2023-01-24T09:36:58+00:00* 3 | G04 #@! TF.ProjectId,aws-iot-expresslink-demo-badge,6177732d-696f-4742-9d65-787072657373,1* 4 | G04 #@! TF.SameCoordinates,Original* 5 | G04 #@! TF.FileFunction,Profile,NP* 6 | %FSLAX46Y46*% 7 | G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* 8 | G04 Created by KiCad (PCBNEW 6.0.7+dfsg-1~bpo11+1) date 2023-01-24 09:36:58* 9 | %MOMM*% 10 | %LPD*% 11 | G01* 12 | G04 APERTURE LIST* 13 | G04 #@! TA.AperFunction,Profile* 14 | %ADD10C,0.100000*% 15 | G04 #@! TD* 16 | G04 #@! TA.AperFunction,Profile* 17 | %ADD11C,0.120000*% 18 | G04 #@! TD* 19 | G04 APERTURE END LIST* 20 | D10* 21 | X138571025Y-83518091D02* 22 | G75* 23 | G03* 24 | X83221775Y-83518091I-27674625J-109771770D01* 25 | G01* 26 | X81279998Y-167811598D02* 27 | G75* 28 | G03* 29 | X82396777Y-169462430I1776602J-1302D01* 30 | G01* 31 | X140512781Y-85902800D02* 32 | G75* 33 | G03* 34 | X138571025Y-83518091I-2459181J-19500D01* 35 | G01* 36 | X140512800Y-85902800D02* 37 | X140512800Y-167811598D01* 38 | X83221778Y-83518103D02* 39 | G75* 40 | G03* 41 | X81280000Y-85902800I516522J-2403497D01* 42 | G01* 43 | X82396777Y-169462430D02* 44 | G75* 45 | G03* 46 | X139396023Y-169462430I28499623J105259042D01* 47 | G01* 48 | X139396039Y-169462469D02* 49 | G75* 50 | G03* 51 | X140512800Y-167811598I-671439J1657369D01* 52 | G01* 53 | X81280000Y-167811598D02* 54 | X81280000Y-85902800D01* 55 | X137829031Y-84792482D02* 56 | X123052391Y-82213545D01* 57 | X122622569Y-84676318D02* 58 | X137399209Y-87255255D01* 59 | X123052391Y-82213545D02* 60 | G75* 61 | G03* 62 | X122622569Y-84676318I-202016J-1233637D01* 63 | G01* 64 | X137399209Y-87255254D02* 65 | G75* 66 | G03* 67 | X137829031Y-84792482I214911J1231386D01* 68 | G01* 69 | X98740409Y-82213545D02* 70 | X83963769Y-84792482D01* 71 | X84393591Y-87255255D02* 72 | X99170231Y-84676318D01* 73 | X99170231Y-84676319D02* 74 | G75* 75 | G03* 76 | X98740409Y-82213545I-214911J1231387D01* 77 | G01* 78 | X83963769Y-84792482D02* 79 | G75* 80 | G03* 81 | X84393591Y-87255255I227806J-1229136D01* 82 | G01* 83 | D11* 84 | X102155800Y-137737600D02* 85 | X121255800Y-137737600D01* 86 | X121255800Y-139363200D02* 87 | X102155800Y-139363200D01* 88 | X102155800Y-137737600D02* 89 | G75* 90 | G03* 91 | X102155800Y-139363200I0J-812800D01* 92 | G01* 93 | X121255800Y-139363200D02* 94 | G75* 95 | G03* 96 | X121255800Y-137737600I0J812800D01* 97 | G01* 98 | M02* 99 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/snapshot/Manufacturers/JLCPCB/aws-iot-expresslink-demo-badge-NPTH.drl: -------------------------------------------------------------------------------- 1 | M48 2 | ; DRILL file {KiCad 6.0.7+dfsg-1~bpo11+1} date Tue Jan 24 09:36:58 2023 3 | ; FORMAT={-:-/ absolute / metric / decimal} 4 | ; #@! TF.CreationDate,2023-01-24T09:36:58+00:00 5 | ; #@! TF.GenerationSoftware,Kicad,Pcbnew,6.0.7+dfsg-1~bpo11+1 6 | ; #@! TF.FileFunction,NonPlated,1,2,NPTH 7 | FMAT,2 8 | METRIC 9 | % 10 | G90 11 | G05 12 | T0 13 | M30 14 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/snapshot/Manufacturers/JLCPCB/aws-iot-expresslink-demo-badge-PTH.drl: -------------------------------------------------------------------------------- 1 | M48 2 | ; DRILL file {KiCad 6.0.7+dfsg-1~bpo11+1} date Tue Jan 24 09:36:58 2023 3 | ; FORMAT={-:-/ absolute / metric / decimal} 4 | ; #@! TF.CreationDate,2023-01-24T09:36:58+00:00 5 | ; #@! TF.GenerationSoftware,Kicad,Pcbnew,6.0.7+dfsg-1~bpo11+1 6 | ; #@! TF.FileFunction,Plated,1,2,PTH 7 | FMAT,2 8 | METRIC 9 | ; #@! TA.AperFunction,Plated,PTH,ViaDrill 10 | T1C0.279 11 | ; #@! TA.AperFunction,Plated,PTH,ComponentDrill 12 | T2C0.750 13 | ; #@! TA.AperFunction,Plated,PTH,ComponentDrill 14 | T3C1.020 15 | % 16 | G90 17 | G05 18 | T1 19 | X82.093Y-86.563 20 | X82.169Y-139.344 21 | X82.804Y-119.99 22 | X84.023Y-166.878 23 | X84.074Y-134.112 24 | X85.649Y-114.148 25 | X86.004Y-100.279 26 | X87.681Y-135.814 27 | X87.827Y-132.613 28 | X89.51Y-120.802 29 | X89.814Y-90.272 30 | X90.139Y-94.457 31 | X90.272Y-107.696 32 | X91.008Y-137.541 33 | X91.897Y-114.148 34 | X91.897Y-120.802 35 | X92.05Y-95.478 36 | X92.405Y-90.373 37 | X92.405Y-100.254 38 | X93.243Y-133.807 39 | X93.878Y-90.5 40 | X93.98Y-86.258 41 | X94.793Y-169.342 42 | X94.894Y-120.802 43 | X95.555Y-137.541 44 | X95.758Y-107.696 45 | X96.876Y-94.894 46 | X97.307Y-91.262 47 | X97.588Y-99.974 48 | X98.323Y-93.167 49 | X98.324Y-99.982 50 | X98.349Y-107.696 51 | X98.4Y-138.176 52 | X99.314Y-167.081 53 | X99.39Y-100.66 54 | X99.822Y-92.1 55 | X100.94Y-120.802 56 | X101.194Y-89.408 57 | X101.651Y-135.052 58 | X103.302Y-86.411 59 | X103.937Y-88.392 60 | X105.82Y-91.122 61 | X105.943Y-92.024 62 | X105.943Y-93.294 63 | X105.969Y-136.068 64 | X106.389Y-93.938 65 | X106.451Y-92.659 66 | X106.731Y-89.408 67 | X106.959Y-92.024 68 | X106.959Y-97.917 69 | X107.217Y-93.938 70 | X109.499Y-107.772 71 | X110.49Y-95.504 72 | X110.871Y-170.917 73 | X113.208Y-128.753 74 | X114.173Y-92.05 75 | X114.656Y-89.052 76 | X114.656Y-90.754 77 | X115.113Y-93.878 78 | X115.468Y-91.796 79 | X115.595Y-107.772 80 | X115.976Y-92.634 81 | X116.053Y-98.882 82 | X118.415Y-86.309 83 | X118.821Y-99.161 84 | X119.329Y-166.98 85 | X119.685Y-93.828 86 | X119.913Y-100.025 87 | X119.939Y-95.555 88 | X120.548Y-87.198 89 | X121.564Y-88.341 90 | X122.834Y-107.772 91 | X122.885Y-135.382 92 | X124.536Y-133.096 93 | X125.451Y-117.272 94 | X127.102Y-169.545 95 | X127.61Y-86.411 96 | X128.829Y-99.085 97 | X130.048Y-131.115 98 | X130.734Y-132.766 99 | X131.328Y-151.979 100 | X131.521Y-132.766 101 | X132.232Y-136.703 102 | X133.35Y-133.35 103 | X134.214Y-99.365 104 | X134.214Y-106.985 105 | X134.214Y-110.414 106 | X134.417Y-91.745 107 | X134.823Y-151.994 108 | X135.179Y-165.252 109 | X135.382Y-133.35 110 | X135.433Y-149.758 111 | X135.534Y-130.683 112 | X135.687Y-143.408 113 | X135.89Y-99.365 114 | X136.144Y-152.806 115 | X136.169Y-129.896 116 | X136.627Y-99.365 117 | X136.957Y-133.274 118 | X137.058Y-130.708 119 | X137.439Y-132.715 120 | X137.513Y-137.922 121 | X137.513Y-143.386 122 | X137.643Y-151.181 123 | X137.97Y-132.205 124 | X138.379Y-106.521 125 | X138.655Y-107.203 126 | X138.836Y-166.827 127 | X138.887Y-107.902 128 | X139.217Y-108.56 129 | X139.548Y-106.477 130 | X139.725Y-151.79 131 | X139.751Y-86.512 132 | X139.852Y-123.85 133 | X139.852Y-140.005 134 | T2 135 | X83.963Y-90.895 136 | X85.963Y-90.895 137 | T3 138 | X83.109Y-106.096 139 | X83.109Y-123.876 140 | X85.649Y-106.096 141 | X85.649Y-123.876 142 | X88.189Y-106.096 143 | X88.189Y-123.876 144 | X90.729Y-106.096 145 | X90.729Y-123.876 146 | X93.269Y-106.096 147 | X93.269Y-123.876 148 | X95.809Y-106.096 149 | X95.809Y-123.876 150 | X98.349Y-106.096 151 | X98.349Y-123.876 152 | X100.889Y-106.096 153 | X100.889Y-123.876 154 | X103.429Y-106.096 155 | X103.429Y-123.876 156 | X105.969Y-106.096 157 | X105.969Y-123.876 158 | X108.509Y-106.096 159 | X108.509Y-123.876 160 | X111.049Y-106.096 161 | X111.049Y-123.876 162 | X113.589Y-106.096 163 | X113.589Y-123.876 164 | X116.129Y-106.096 165 | X116.129Y-123.876 166 | X118.669Y-106.096 167 | X118.669Y-123.876 168 | X121.209Y-106.096 169 | X121.209Y-123.876 170 | X123.749Y-106.096 171 | X123.749Y-123.876 172 | X126.289Y-106.096 173 | X126.289Y-123.876 174 | X128.829Y-106.096 175 | X128.829Y-123.876 176 | X131.139Y-112.446 177 | X131.139Y-114.986 178 | X131.139Y-117.526 179 | X131.369Y-106.096 180 | X131.369Y-123.876 181 | T0 182 | M30 183 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/snapshot/Manufacturers/JLCPCB/aws-iot-expresslink-demo-badge_bom_jlc.csv: -------------------------------------------------------------------------------- 1 | "Comment","Designator","Footprint","LCSC Part #" 2 | "ALS-PT19-315C/L177/TR8","A1","XDCR_ALS-PT19-315C_L177_TR8","C146233" 3 | "27pf","C14,C15","C_0603_1608Metric","C107045" 4 | "100n","C1,C2,C3,C10,C12,C13,C16,C17,C18,C22","C_0603_1608Metric","C14663" 5 | "1u","C4,C5,C6,C8,C9,C11,C20,C21","C_0603_1608Metric","C15849" 6 | "10u","C7,C19","C_0603_1608Metric","C19702" 7 | "1N5819WS","D6","D_SOD-323","C191023" 8 | "WS2812B","D1,D2,D3,D4,D5","SK6812-multi","C2874885" 9 | "QWIIC","J3","JST_SH_SM04B-SRSS-TB_1x04-1MP_P1.00mm_Horizontal","C145956" 10 | "socket-matching-battery-holder-plug","J4","JST_PH_S2B-PH-K_1x02_P2.00mm_Horizontal","C173752" 11 | "2N7002","Q1,Q3","SOT-23","C8545" 12 | "DMG2305UX-7","Q2","SOT-23","C150470" 13 | "7.5","R6","R_0603_1608Metric","C365480" 14 | "1k","R1,R2,R11,R17","R_0603_1608Metric","C21190" 15 | "4k7","R3,R4","R_0603_1608Metric","C105428" 16 | "10k","R5,R7,R8,R10,R12,R13,R14,R15,R16,R18,R19,R20","R_0603_1608Metric","C25804" 17 | "JS202011SCQN","SW2","JS202011SCQN","C221666" 18 | "PTS815_SJM_250_SMTR_LFS","SW1,SW3,SW4,SW5","PTS815 SJM 250 SMTR LFS","C2689510" 19 | "ESP32-C3-MINI-1-A","U7","ESP32-C3-MINI-1","C5224444" 20 | "LIS3DH","U3","LGA-16_3x3mm_P0.5mm_LayoutBorder3x5y","C15134" 21 | "NT3H2211W0FHKH","U5","IC_NT3H2211W0FHKH","C2905792" 22 | "SHT30-DIS","U1","Sensirion_DFN-8-1EP_2.5x2.5mm_P0.5mm_EP1.1x1.7mm","C77361" 23 | "Waveshare-RP2040-Plus","U2","Waveshare-RP2040-Plus","C5159530" 24 | "Crystal","Y1","Crystal_SMD_3215-2Pin_3.2x1.5mm","C32346" 25 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/snapshot/Manufacturers/JLCPCB/aws-iot-expresslink-demo-badge_cpl_jlc.csv: -------------------------------------------------------------------------------- 1 | Designator,Val,Package,Mid X,Mid Y,Rotation,Layer 2 | "A1","ALS-PT19-315C/L177/TR8","XDCR_ALS-PT19-315C_L177_TR8",92.9067,-135.8392,0.0000,top 3 | "C1","100n","C_0603_1608Metric",88.6395,-134.0866,-90.0000,bottom 4 | "C2","100n","C_0603_1608Metric",93.1209,-92.2020,-90.0000,bottom 5 | "C3","100n","C_0603_1608Metric",134.5692,-130.6830,90.0000,bottom 6 | "C4","1u","C_0603_1608Metric",96.8248,-97.2058,90.0000,bottom 7 | "C5","1u","C_0603_1608Metric",105.8418,-97.2058,90.0000,bottom 8 | "C6","1u","C_0603_1608Metric",114.9858,-97.2058,90.0000,bottom 9 | "C7","10u","C_0603_1608Metric",133.2992,-92.9640,-90.0000,bottom 10 | "C8","1u","C_0603_1608Metric",124.1298,-97.2058,90.0000,bottom 11 | "C9","1u","C_0603_1608Metric",133.2738,-97.2058,90.0000,bottom 12 | "C10","100n","C_0603_1608Metric",126.3774,-135.3820,0.0000,bottom 13 | "C11","1u","C_0603_1608Metric",126.3774,-133.8834,0.0000,bottom 14 | "C12","100n","C_0603_1608Metric",135.4328,-148.3360,-90.0000,bottom 15 | "C13","100n","C_0603_1608Metric",136.9568,-148.3360,-90.0000,bottom 16 | "C14","27pf","C_0603_1608Metric",107.7214,-90.4240,90.0000,bottom 17 | "C15","27pf","C_0603_1608Metric",113.5634,-90.5510,90.0000,bottom 18 | "C16","100n","C_0603_1608Metric",136.1948,-146.0500,0.0000,bottom 19 | "C17","100n","C_0603_1608Metric",103.8352,-93.5228,0.0000,bottom 20 | "C18","100n","C_0603_1608Metric",103.8352,-87.6300,0.0000,bottom 21 | "C19","10u","C_0603_1608Metric",103.8352,-89.1032,0.0000,bottom 22 | "C20","1u","C_0603_1608Metric",100.1268,-135.8900,-90.0000,bottom 23 | "C21","1u","C_0603_1608Metric",97.0788,-135.8900,-90.0000,bottom 24 | "C22","100n","C_0603_1608Metric",90.2651,-135.8900,90.0000,bottom 25 | "D1","WS2812B","SK6812-multi",92.3798,-97.2058,0.0000,bottom 26 | "D2","WS2812B","SK6812-multi",101.2698,-97.2058,0.0000,bottom 27 | "D3","WS2812B","SK6812-multi",110.5308,-97.2058,0.0000,bottom 28 | "D4","WS2812B","SK6812-multi",119.6848,-97.2058,0.0000,bottom 29 | "D5","WS2812B","SK6812-multi",128.8288,-97.2058,0.0000,bottom 30 | "D6","1N5819WS","D_SOD-323",138.6840,-146.9136,90.0000,bottom 31 | "J3","QWIIC","JST_SH_SM04B-SRSS-TB_1x04-1MP_P1.00mm_Horizontal",137.6172,-94.2340,-90.0000,bottom 32 | "J4","socket-matching-battery-holder-plug","JST_PH_S2B-PH-K_1x02_P2.00mm_Horizontal",85.9630,-90.8950,180.0000,bottom 33 | "Q1","2N7002","SOT-23",98.9584,-92.2020,180.0000,bottom 34 | "Q2","DMG2305UX-7","SOT-23",90.4285,-92.2020,0.0000,bottom 35 | "Q3","2N7002","SOT-23",129.8318,-134.8486,180.0000,bottom 36 | "R1","1k","R_0603_1608Metric",96.1644,-92.2020,-90.0000,bottom 37 | "R2","1k","R_0603_1608Metric",94.6449,-92.2020,90.0000,bottom 38 | "R3","4k7","R_0603_1608Metric",136.1948,-100.3300,180.0000,bottom 39 | "R4","4k7","R_0603_1608Metric",136.1948,-101.8286,180.0000,bottom 40 | "R5","10k","R_0603_1608Metric",132.5242,-134.8740,90.0000,bottom 41 | "R6","7.5","R_0603_1608Metric",126.3882,-136.8806,0.0000,bottom 42 | "R7","10k","R_0603_1608Metric",117.9068,-93.5228,180.0000,bottom 43 | "R8","10k","R_0603_1608Metric",138.7856,-150.9776,90.0000,bottom 44 | "R10","10k","R_0603_1608Metric",103.8352,-90.5764,180.0000,bottom 45 | "R11","1k","R_0603_1608Metric",110.6424,-93.2180,180.0000,bottom 46 | "R12","10k","R_0603_1608Metric",103.8352,-92.0496,180.0000,bottom 47 | "R13","10k","R_0603_1608Metric",136.1816,-103.9876,180.0000,bottom 48 | "R14","10k","R_0603_1608Metric",136.1816,-105.4862,180.0000,bottom 49 | "R15","10k","R_0603_1608Metric",98.6028,-135.8900,90.0000,bottom 50 | "R16","10k","R_0603_1608Metric",136.1816,-106.9848,180.0000,bottom 51 | "R17","1k","R_0603_1608Metric",95.5548,-135.8900,-90.0000,bottom 52 | "R18","10k","R_0603_1608Metric",99.2124,-89.4080,180.0000,bottom 53 | "R19","10k","R_0603_1608Metric",117.9068,-92.0242,180.0000,bottom 54 | "R20","10k","R_0603_1608Metric",117.9068,-90.5256,180.0000,bottom 55 | "SW1","PTS815_SJM_250_SMTR_LFS","PTS815 SJM 250 SMTR LFS",84.9204,-95.4024,90.0000,top 56 | "SW2","JS202011SCQN","JS202011SCQN",92.4560,-95.4024,180.0000,top 57 | "SW3","PTS815_SJM_250_SMTR_LFS","PTS815 SJM 250 SMTR LFS",94.8964,-168.7068,-10.0000,top 58 | "SW4","PTS815_SJM_250_SMTR_LFS","PTS815 SJM 250 SMTR LFS",110.8964,-170.1668,0.0000,top 59 | "SW5","PTS815_SJM_250_SMTR_LFS","PTS815 SJM 250 SMTR LFS",126.8964,-168.7068,10.0000,top 60 | "U1","SHT30-DIS","Sensirion_DFN-8-1EP_2.5x2.5mm_P0.5mm_EP1.1x1.7mm",86.0485,-134.0866,270.0000,top 61 | "U2","Waveshare-RP2040-Plus","Waveshare-RP2040-Plus",107.2388,-114.9858,-90.0000,bottom 62 | "U3","LIS3DH","LGA-16_3x3mm_P0.5mm_LayoutBorder3x5y",132.0800,-130.6068,0.0000,top 63 | "U4","ER-TFT013-2","ER-TFT013-2",97.5558,-107.1560,0.0000,top 64 | "U5","NT3H2211W0FHKH","IC_NT3H2211W0FHKH",136.1440,-151.1808,270.0000,top 65 | "U7","ESP32-C3-MINI-1-A","ESP32-C3-MINI-1",110.8964,-91.4400,0.0000,top 66 | "Y1","Crystal","Crystal_SMD_3215-2Pin_3.2x1.5mm",110.6424,-89.7890,0.0000,bottom 67 | -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/snapshot/Manufacturers/aws-iot-expresslink-demo-badge-JLCPCB.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/hardware-designs/DemoBadge/snapshot/Manufacturers/aws-iot-expresslink-demo-badge-JLCPCB.zip -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/snapshot/Schematic/aws-iot-expresslink-demo-badge-schematic.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-expresslink/4377286da39a3ed6b9f0be5d15c144df964d09e7/hardware-designs/DemoBadge/snapshot/Schematic/aws-iot-expresslink-demo-badge-schematic.pdf -------------------------------------------------------------------------------- /hardware-designs/DemoBadge/sym-lib-table: -------------------------------------------------------------------------------- 1 | (sym_lib_table 2 | (lib (name "MCU_RaspberryPi_and_Boards")(type "KiCad")(uri "${KIPRJMOD}/components/RP-Pico Libraries/MCU_RaspberryPi_and_Boards.kicad_sym")(options "")(descr "")) 3 | (lib (name "Espressif")(type "KiCad")(uri "${KIPRJMOD}/components/espressif-kicad-libraries/libraries/Espressif.kicad_sym")(options "")(descr "")) 4 | (lib (name "ER-TFT013-2")(type "KiCad")(uri "${KIPRJMOD}/components/ER-TFT013-2/ER-TFT013-2.kicad_sym")(options "")(descr "")) 5 | (lib (name "NT3H2211W0FHKH")(type "KiCad")(uri "${KIPRJMOD}/components/NT3H2211W0FHKH/NT3H2211W0FHKH.kicad_sym")(options "")(descr "")) 6 | (lib (name "PTS815")(type "KiCad")(uri "${KIPRJMOD}/components/PTS815/PTS815.kicad_sym")(options "")(descr "")) 7 | (lib (name "JS2020")(type "KiCad")(uri "${KIPRJMOD}/components/JS2020/JS2020.kicad_sym")(options "")(descr "")) 8 | (lib (name "IN-S32GTLS")(type "KiCad")(uri "${KIPRJMOD}/components/IN-S32GTLS/IN-S32GTLS.kicad_sym")(options "")(descr "")) 9 | (lib (name "ALS-PT19-315C_L177_TR8")(type "KiCad")(uri "${KIPRJMOD}/components/ALS-PT19-315C_L177_TR8/ALS-PT19-315C_L177_TR8.kicad_sym")(options "")(descr "")) 10 | ) 11 | -------------------------------------------------------------------------------- /libraries/C/README.md: -------------------------------------------------------------------------------- 1 | The AWS IoT ExpressLink libraries written in C on different MCU platforms. 2 | 1. STM32: https://github.com/stm32-hotspot/I-CUBE-ExpressLink 3 | -------------------------------------------------------------------------------- /libraries/arduino/README.md: -------------------------------------------------------------------------------- 1 | The AWS IoT ExpressLink library for Arduino is available in this GitHub repository: 2 | 3 | [awslabs/aws-iot-expresslink-library-arduino](https://github.com/awslabs/aws-iot-expresslink-library-arduino) 4 | -------------------------------------------------------------------------------- /libraries/python/README.md: -------------------------------------------------------------------------------- 1 | The AWS IoT ExpressLink library for Python, CircuitPython, and MicroPython is available in this GitHub repository: 2 | 3 | [awslabs/aws-iot-expresslink-library-python](https://github.com/awslabs/aws-iot-expresslink-library-python) 4 | --------------------------------------------------------------------------------