From 5285436956f4e897c02cf7c7d681e5c20b4885a8 Mon Sep 17 00:00:00 2001 From: Nico Melone Date: Wed, 28 Apr 2021 22:32:53 -0400 Subject: [PATCH] initial --- AWS_IoT_WiFi_copy.ino | 220 ++++++++++++++++++++++++++++++++++++++++++ README.md | 2 + Servo_Adapter_v1.stl | Bin 0 -> 66784 bytes Servo_Adapter_v6.stl | Bin 0 -> 78584 bytes arduino_secrets.h | 23 +++++ 5 files changed, 245 insertions(+) create mode 100644 AWS_IoT_WiFi_copy.ino create mode 100644 README.md create mode 100644 Servo_Adapter_v1.stl create mode 100644 Servo_Adapter_v6.stl create mode 100644 arduino_secrets.h diff --git a/AWS_IoT_WiFi_copy.ino b/AWS_IoT_WiFi_copy.ino new file mode 100644 index 0000000..36eaf33 --- /dev/null +++ b/AWS_IoT_WiFi_copy.ino @@ -0,0 +1,220 @@ +#include "arduino_secrets.h" +/* + AWS IoT WiFi + + This sketch securely connects to an AWS IoT using MQTT over WiFi. + It uses a private key stored in the ATECC508A and a public + certificate for SSL/TLS authetication. + + It publishes a message every 5 seconds to arduino/outgoing + topic and subscribes to messages on the arduino/incoming + topic. + + The circuit: + - Arduino MKR WiFi 1010 or MKR1000 + + The following tutorial on Arduino Project Hub can be used + to setup your AWS account and the MKR board: + + https://create.arduino.cc/projecthub/132016/securely-connecting-an-arduino-mkr-wifi-1010-to-aws-iot-core-a9f365 + + This example code is in the public domain. +*/ + +#include +#include +#include +#include // change to #include for MKR1000 +#include + +Servo myservo; // create a servo object +int angle = 0; // variable to hold the angle for the servo motor +int pos; +int burner_status = 1; //assume on for safety +float burner_range = 170.0; +/////// Enter your sensitive data in arduino_secrets.h +const char ssid[] = SECRET_SSID; +const char pass[] = SECRET_PASS; +const char broker[] = SECRET_BROKER; +const char* certificate = SECRET_CERTIFICATE; + +WiFiClient wifiClient; // Used for the TCP socket connection +BearSSLClient sslClient(wifiClient); // Used for SSL/TLS connection, integrates with ECC508 +MqttClient mqttClient(sslClient); + +unsigned long lastMillis = 0; + +void setup() { + Serial.begin(115200); + //while (!Serial); + + if (!ECCX08.begin()) { + Serial.println("No ECCX08 present!"); + while (1); + } + + // Set a callback to get the current time + // used to validate the servers certificate + ArduinoBearSSL.onGetTime(getTime); + + // Set the ECCX08 slot to use for the private key + // and the accompanying public certificate for it + sslClient.setEccSlot(0, certificate); + + // Optional, set the client id used for MQTT, + // each device that is connected to the broker + // must have a unique client id. The MQTTClient will generate + // a client id for you based on the millis() value if not set + // + // mqttClient.setId("clientId"); + + // Set the message callback, this function is + // called when the MQTTClient receives a message + mqttClient.onMessage(onMessageReceived); + myservo.attach(5); // attaches the servo on pin 9 to the servo object + myservo.write(0); //set servo to starting position + burner_status = 0; //should be off now +} + +void loop() { + if (WiFi.status() != WL_CONNECTED) { + connectWiFi(); + } + + if (!mqttClient.connected()) { + // MQTT client is disconnected, connect + connectMQTT(); + } + + // poll for new MQTT messages and send keep alives + mqttClient.poll(); + + // publish a message roughly every 5 seconds. +// if (millis() - lastMillis > 5000) { +// lastMillis = millis(); +// +// publishMessage(); +// } + +} + +unsigned long getTime() { + // get the current time from the WiFi module + return WiFi.getTime(); +} + +void connectWiFi() { + Serial.print("Attempting to connect to SSID: "); + Serial.print(ssid); + Serial.print(" "); + + while (WiFi.begin(ssid, pass) != WL_CONNECTED) { + // failed, retry + Serial.print("."); + delay(5000); + } + Serial.println(); + + Serial.println("You're connected to the network"); + Serial.println(); +} + +void connectMQTT() { + Serial.print("Attempting to MQTT broker: "); + Serial.print(broker); + Serial.println(" "); + + while (!mqttClient.connect(broker, 8883)) { + // failed, retry + Serial.print("."); + delay(5000); + } + Serial.println(); + + Serial.println("You're connected to the MQTT broker"); + Serial.println(); + + // subscribe to a topic + mqttClient.subscribe("arduino/incoming"); +} + +void publishMessage() { + Serial.println("Publishing message"); + + // send message, the Print interface can be used to set the message contents + mqttClient.beginMessage("arduino/outgoing"); + mqttClient.print("hello "); + mqttClient.print(millis()); + mqttClient.endMessage(); +} + +void onMessageReceived(int messageSize) { + // we received a message, print out the topic and contents + Serial.print("Received a message with topic '"); + Serial.print(mqttClient.messageTopic()); + Serial.print("', length "); + Serial.print(messageSize); + Serial.println(" bytes:"); + //pos = mqttClient.parseInt(); + //Serial.println(pos); + //myservo.write(pos); + //set_to_percent(pos); + String message = mqttClient.readString(); + Serial.println("Recieved preset: " + message); + if(messageSize > 1){ //know more than 1 char means either string or number >= 10 + if(message.toInt()){ + set_to_percent(message.toInt()); + }else { + set_to_preset(message); + } + }else { //know that only one char exists meaning a number less than 10 so send to percent + if(!message.toInt()){ + off(); + }else { + set_to_percent(message.toInt()); + } + } + Serial.println(); + + Serial.println(); +} +void off(){ + myservo.write(0); + burner_status = 0; + Serial.println("ALL CLEAR ALL CLEAR ALL CLEAR!!!"); +} + +void ignite(){ + if(!burner_status){ + myservo.write(burner_range); //full open to ignite space + delay(3000);//wait for ignition + myservo.write(burner_range-20.0);//bring back from ignite space to HIGH + burner_status = 1; + Serial.println("BURNER IS ON BE CAREFUL!!!"); + } +} + +void set_to_percent(int percent){ + //percent should be 0 to 100 aka 50% is 50 + float percent_f = percent/100.0; + Serial.print("setting position to: "); + Serial.println(burner_range*percent_f); + if(!burner_status){ + ignite(); + } + myservo.write(burner_range * percent_f); //naivly assume range is 180 for now it's not actually 180 +} + +void set_to_preset(String preset){ + Serial.println(preset); + if (preset == "off"){ + Serial.println("Turning off"); + off(); + }else if(preset.equalsIgnoreCase("low")){ + set_to_percent(20); + }else if(preset.equalsIgnoreCase("medium")){ + set_to_percent(50); + }else if(preset.equalsIgnoreCase("high")){ + set_to_percent(90); + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..f26d21b --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# Automatic Stove Burner + diff --git a/Servo_Adapter_v1.stl b/Servo_Adapter_v1.stl new file mode 100644 index 0000000000000000000000000000000000000000..82b451627fb8543c9d0f1044ec235a0b9d682eed GIT binary patch literal 66784 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

*&D9ciU}{vGq}?J^(~+OqG<#|{vBgWo`43v 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

vR6X9%`1AuSYZ+Zlo_OvqD!mFf(^7AE9L v!@6^ZU<(uSG-DMxCHlDMY+*ur46F%f2(~aGy%JV