Compare commits
No commits in common. "1d3e908a898ec74fcf564a86c106e7cc7d5a4fb8" and "6cf254fa5531d9dd3e1d6c3fc36194ef5f9660ff" have entirely different histories.
1d3e908a89
...
6cf254fa55
@ -1,129 +1,51 @@
|
|||||||
#include <Arduino_MKRIoTCarrier.h>
|
#include <Arduino_MKRIoTCarrier.h>
|
||||||
#include <WiFiNINA.h>
|
#include <WiFiNINA.h>
|
||||||
#include <ArduinoMqttClient.h>
|
#include <ArduinoMqttClient.h>
|
||||||
#include "motor.h"
|
|
||||||
#include "secrets.h"
|
#include "secrets.h"
|
||||||
|
|
||||||
#define INPUT_SIZE 4
|
|
||||||
|
|
||||||
enum state {
|
|
||||||
STATE_CONNECTING,
|
|
||||||
STATE_LOGGED_OUT,
|
|
||||||
STATE_LOGGED_IN,
|
|
||||||
STATE_INPUT_PASSCODE,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum state current_state;
|
|
||||||
char input_code[INPUT_SIZE + 1];
|
|
||||||
|
|
||||||
MKRIoTCarrier carrier;
|
MKRIoTCarrier carrier;
|
||||||
WiFiSSLClient wifi_client;
|
WiFiSSLClient wifi_client;
|
||||||
MqttClient mqtt_client(wifi_client);
|
MqttClient mqtt_client(wifi_client);
|
||||||
|
|
||||||
// Motor control variables
|
// Motor pins
|
||||||
|
int motor_pin1 = 8; // Blue - 28BYJ48 pin 1
|
||||||
|
int motor_pin2 = 9; // Pink - 28BYJ48 pin 2
|
||||||
|
int motor_pin3 = 10; // Yellow - 28BYJ48 pin 3
|
||||||
|
int motor_pin4 = 11; // Orange - 28BYJ48 pin 4
|
||||||
|
|
||||||
|
// Motor variables
|
||||||
|
int motor_speed = 1200;
|
||||||
int motor_count = 0;
|
int motor_count = 0;
|
||||||
int motor_count_max = 64;
|
int motor_count_max = 64;
|
||||||
|
int motor_lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
|
||||||
|
uint32_t green_led_color = carrier.leds.Color(0,255,0);
|
||||||
|
|
||||||
uint32_t green_led_color = carrier.leds.Color(0, 255, 0);
|
|
||||||
|
|
||||||
bool is_input_empty()
|
enum state {
|
||||||
{
|
STATE_CONNECTING,
|
||||||
for (int i = 0; i < INPUT_SIZE; i++) {
|
STATE_LOGGED_OUT,
|
||||||
if (input_code[i]) return false;
|
STATE_LOGGED_IN,
|
||||||
}
|
STATE_INPUT_PASSCODE,
|
||||||
return true;
|
};
|
||||||
}
|
enum state current_state;
|
||||||
|
|
||||||
bool is_input_full()
|
void setup(void)
|
||||||
{
|
|
||||||
for (int i = 0; i < INPUT_SIZE; i++) {
|
|
||||||
if (!input_code[i]) return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void change_state(enum state new_state)
|
|
||||||
{
|
|
||||||
// Initialize state
|
|
||||||
switch (new_state) {
|
|
||||||
case STATE_INPUT_PASSCODE:
|
|
||||||
input_code[0] = '\0';
|
|
||||||
input_code[1] = '\0';
|
|
||||||
input_code[2] = '\0';
|
|
||||||
input_code[3] = '\0';
|
|
||||||
input_code[4] = '\0';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
current_state = new_state;
|
|
||||||
draw_state();
|
|
||||||
}
|
|
||||||
|
|
||||||
void draw_state()
|
|
||||||
{
|
|
||||||
carrier.display.fillScreen(0x000);
|
|
||||||
|
|
||||||
switch (current_state) {
|
|
||||||
case STATE_CONNECTING:
|
|
||||||
carrier.display.setCursor(20, 100);
|
|
||||||
carrier.display.setTextSize(3);
|
|
||||||
carrier.display.print("Connecting..");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_LOGGED_OUT:
|
|
||||||
carrier.display.setCursor(15, 100);
|
|
||||||
carrier.display.setTextSize(2);
|
|
||||||
carrier.display.print("Press Green Button");
|
|
||||||
carrier.leds.fill(green_led_color, 2, 1);
|
|
||||||
carrier.leds.setBrightness(5);
|
|
||||||
carrier.leds.show();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_INPUT_PASSCODE:
|
|
||||||
if (is_input_empty()) {
|
|
||||||
carrier.display.setCursor(50, 100);
|
|
||||||
carrier.display.setTextSize(2);
|
|
||||||
carrier.display.print("Please enter");
|
|
||||||
carrier.display.setCursor(80, 120);
|
|
||||||
carrier.display.print("passcode");
|
|
||||||
} else {
|
|
||||||
carrier.display.setCursor(50, 100);
|
|
||||||
carrier.display.setTextSize(3);
|
|
||||||
for (int i = 0; i < INPUT_SIZE; i++) {
|
|
||||||
char ch = input_code[i];
|
|
||||||
if (!ch) ch = '_';
|
|
||||||
|
|
||||||
carrier.display.print(ch);
|
|
||||||
carrier.display.print(' ');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case STATE_LOGGED_IN:
|
|
||||||
carrier.display.setCursor(40, 100);
|
|
||||||
carrier.display.setTextSize(3);
|
|
||||||
carrier.display.print("Logged in");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void setup()
|
|
||||||
{
|
{
|
||||||
|
current_state = STATE_CONNECTING;
|
||||||
Serial.begin(9600);
|
Serial.begin(9600);
|
||||||
|
|
||||||
Serial.println("Started");
|
Serial.println("Started");
|
||||||
|
|
||||||
carrier.noCase();
|
|
||||||
carrier.begin();
|
carrier.begin();
|
||||||
|
|
||||||
carrier.display.init(240, 240);
|
carrier.display.init(240, 240);
|
||||||
|
|
||||||
motor_setup();
|
|
||||||
|
|
||||||
pinMode(TFT_BACKLIGHT, OUTPUT);
|
pinMode(TFT_BACKLIGHT, OUTPUT);
|
||||||
digitalWrite(TFT_BACKLIGHT, HIGH);
|
digitalWrite(TFT_BACKLIGHT, HIGH);
|
||||||
|
|
||||||
change_state(STATE_CONNECTING);
|
carrier.display.setCursor(20, 100);
|
||||||
|
carrier.display.setTextSize(3);
|
||||||
|
carrier.display.print("Connecting..");
|
||||||
|
|
||||||
Serial.println("Connecting to WiFi...");
|
Serial.println("Connecting to WiFi...");
|
||||||
|
|
||||||
@ -143,17 +65,31 @@ void setup()
|
|||||||
|
|
||||||
Serial.println("Connected to MQTT");
|
Serial.println("Connected to MQTT");
|
||||||
|
|
||||||
carrier.Buzzer.beep();
|
|
||||||
|
|
||||||
mqtt_client.subscribe("dispense");
|
mqtt_client.subscribe("dispense");
|
||||||
mqtt_client.subscribe("login");
|
|
||||||
|
|
||||||
change_state(STATE_LOGGED_OUT);
|
carrier.display.fillScreen(0x000);
|
||||||
|
|
||||||
|
current_state = STATE_LOGGED_OUT;
|
||||||
|
carrier.display.setCursor(15, 100);
|
||||||
|
carrier.display.setTextSize(2);
|
||||||
|
carrier.display.print("Press Green Button");
|
||||||
|
carrier.leds.begin();
|
||||||
|
carrier.leds.fill(green_led_color, 2, 1);
|
||||||
|
carrier.leds.setBrightness(5);
|
||||||
|
carrier.leds.show();
|
||||||
|
|
||||||
|
carrier.Buttons.begin();
|
||||||
|
// Pinouts for motor - DO NOT ADD CODE AFTER THIS
|
||||||
|
pinMode(motor_pin1, OUTPUT);
|
||||||
|
pinMode(motor_pin2, OUTPUT);
|
||||||
|
pinMode(motor_pin3, OUTPUT);
|
||||||
|
pinMode(motor_pin4, OUTPUT);
|
||||||
|
//do NOT add code after this. DON'T DO IT.
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop()
|
void loop(void)
|
||||||
{
|
{
|
||||||
carrier.Buttons.update();
|
carrier.Buttons.update();
|
||||||
|
|
||||||
// Rotate motor if needed
|
// Rotate motor if needed
|
||||||
if (motor_count) {
|
if (motor_count) {
|
||||||
@ -164,71 +100,55 @@ void loop()
|
|||||||
// Receive MQTT messages
|
// Receive MQTT messages
|
||||||
int message_size = mqtt_client.parseMessage();
|
int message_size = mqtt_client.parseMessage();
|
||||||
if (message_size) {
|
if (message_size) {
|
||||||
String topic = mqtt_client.messageTopic();
|
|
||||||
Serial.print("Got message with topic: ");
|
Serial.print("Got message with topic: ");
|
||||||
Serial.println(topic);
|
Serial.println(mqtt_client.messageTopic());
|
||||||
|
|
||||||
// Parse message
|
if (mqtt_client.messageTopic() == "dispense") {
|
||||||
char *message = (char *)malloc(message_size + 1);
|
|
||||||
for (int i = 0; i < message_size && mqtt_client.available(); i++) {
|
|
||||||
message[i] = (char)mqtt_client.read();
|
|
||||||
}
|
|
||||||
message[message_size] = '\0';
|
|
||||||
|
|
||||||
Serial.print("and payload: ");
|
|
||||||
Serial.println(message);
|
|
||||||
|
|
||||||
// Check topic
|
|
||||||
if (topic == "dispense") {
|
|
||||||
Serial.println("Dispensing...");
|
Serial.println("Dispensing...");
|
||||||
|
|
||||||
// Start rotating motor
|
// Start rotating motor
|
||||||
motor_count = motor_count_max;
|
motor_count = motor_count_max;
|
||||||
} else if (topic == "login") {
|
|
||||||
Serial.println("Logged in");
|
|
||||||
|
|
||||||
int user_id;
|
|
||||||
if (sscanf(message, "%d", &user_id) > 0) {
|
|
||||||
change_state(STATE_LOGGED_IN);
|
|
||||||
} else {
|
|
||||||
change_state(STATE_INPUT_PASSCODE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
free(message);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (current_state) {
|
switch (current_state) {
|
||||||
case STATE_LOGGED_OUT:
|
case STATE_LOGGED_OUT:
|
||||||
if (carrier.Buttons.onTouchDown(TOUCH2)) {
|
if(carrier.Buttons.onTouchDown(TOUCH2)) {
|
||||||
change_state(STATE_INPUT_PASSCODE);
|
current_state = INPUT_PASSCODE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case STATE_INPUT_PASSCODE:
|
|
||||||
touchButtons buttons[] = { TOUCH0, TOUCH1, TOUCH3, TOUCH4 };
|
|
||||||
char input_characters[] = "1234";
|
|
||||||
|
|
||||||
for (int i = 0; i < sizeof(buttons) / sizeof(buttons[0]); i++) {
|
default:
|
||||||
if (carrier.Buttons.onTouchDown(buttons[i])) {
|
break;
|
||||||
for (int j = 0; j < INPUT_SIZE; j++) {
|
};
|
||||||
if (!input_code[j]) {
|
|
||||||
input_code[j] = input_characters[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_input_full()) {
|
}
|
||||||
mqtt_client.beginMessage("login_request");
|
|
||||||
mqtt_client.print(input_code);
|
|
||||||
mqtt_client.endMessage();
|
|
||||||
}
|
|
||||||
|
|
||||||
draw_state();
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
|
||||||
|
//motorgøgl, pls dont touch
|
||||||
|
void motor_clockwise()
|
||||||
|
{
|
||||||
|
for (int i = 7; i >= 0; i--) {
|
||||||
|
motor_set_output(i);
|
||||||
|
delayMicroseconds(motor_speed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void motor_anticlockwise()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 8; i++) {
|
||||||
|
motor_set_output(i);
|
||||||
|
delayMicroseconds(motor_speed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void motor_set_output(int out)
|
||||||
|
{
|
||||||
|
digitalWrite(motor_pin1, bitRead(motor_lookup[out], 0));
|
||||||
|
digitalWrite(motor_pin2, bitRead(motor_lookup[out], 1));
|
||||||
|
digitalWrite(motor_pin3, bitRead(motor_lookup[out], 2));
|
||||||
|
digitalWrite(motor_pin4, bitRead(motor_lookup[out], 3));
|
||||||
|
}
|
||||||
|
@ -1,2 +0,0 @@
|
|||||||
void motor_anticlockwise();
|
|
||||||
void motor_setup();
|
|
@ -1,42 +0,0 @@
|
|||||||
int motor_speed = 1200;
|
|
||||||
int motor_lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
|
|
||||||
|
|
||||||
// Motor pins
|
|
||||||
// Pins 8 and 9 conflict with the display
|
|
||||||
int motor_pin1 = 10; // Blue - 28BYJ48 pin 1
|
|
||||||
int motor_pin2 = 11; // Pink - 28BYJ48 pin 2
|
|
||||||
int motor_pin3 = 12; // Yellow - 28BYJ48 pin 3
|
|
||||||
int motor_pin4 = 13; // Orange - 28BYJ48 pin 4
|
|
||||||
|
|
||||||
|
|
||||||
void motor_setup()
|
|
||||||
{
|
|
||||||
pinMode(motor_pin1, OUTPUT);
|
|
||||||
pinMode(motor_pin2, OUTPUT);
|
|
||||||
pinMode(motor_pin3, OUTPUT);
|
|
||||||
pinMode(motor_pin4, OUTPUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
void motor_clockwise()
|
|
||||||
{
|
|
||||||
for (int i = 7; i >= 0; i--) {
|
|
||||||
motor_set_output(i);
|
|
||||||
delayMicroseconds(motor_speed);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void motor_anticlockwise()
|
|
||||||
{
|
|
||||||
for (int i = 0; i < 8; i++) {
|
|
||||||
motor_set_output(i);
|
|
||||||
delayMicroseconds(motor_speed);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void motor_set_output(int out)
|
|
||||||
{
|
|
||||||
digitalWrite(motor_pin1, bitRead(motor_lookup[out], 0));
|
|
||||||
digitalWrite(motor_pin2, bitRead(motor_lookup[out], 1));
|
|
||||||
digitalWrite(motor_pin3, bitRead(motor_lookup[out], 2));
|
|
||||||
digitalWrite(motor_pin4, bitRead(motor_lookup[out], 3));
|
|
||||||
}
|
|
@ -49,38 +49,8 @@ var options = new MqttClientOptionsBuilder()
|
|||||||
|
|
||||||
await mqttClient.ConnectAsync(options, CancellationToken.None);
|
await mqttClient.ConnectAsync(options, CancellationToken.None);
|
||||||
|
|
||||||
await mqttClient.SubscribeAsync(
|
|
||||||
new MqttFactory().CreateSubscribeOptionsBuilder().WithTopicFilter(f => f.WithTopic("login_request")).Build(),
|
|
||||||
CancellationToken.None
|
|
||||||
);
|
|
||||||
|
|
||||||
ApplicationState.DbContext = new DispenserContext();
|
|
||||||
|
|
||||||
mqttClient.ApplicationMessageReceivedAsync += delegate(MqttApplicationMessageReceivedEventArgs args) {
|
|
||||||
var payload = System.Text.Encoding.Default.GetString(args.ApplicationMessage.PayloadSegment);
|
|
||||||
|
|
||||||
switch (args.ApplicationMessage.Topic) {
|
|
||||||
case "login_request":
|
|
||||||
var user = ApplicationState.DbContext!.Users.FirstOrDefault(user => user.TouchCode == payload);
|
|
||||||
|
|
||||||
var message = new MqttApplicationMessageBuilder()
|
|
||||||
.WithTopic("login");
|
|
||||||
|
|
||||||
if (user == null) {
|
|
||||||
message.WithPayload("error");
|
|
||||||
} else {
|
|
||||||
message.WithPayload(user.Id.ToString());
|
|
||||||
}
|
|
||||||
|
|
||||||
mqttClient.PublishAsync(message.Build());
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Task.CompletedTask;
|
|
||||||
};
|
|
||||||
|
|
||||||
ApplicationState.MqttClient = mqttClient;
|
ApplicationState.MqttClient = mqttClient;
|
||||||
|
ApplicationState.DbContext = new DispenserContext();
|
||||||
|
|
||||||
Console.WriteLine("Connected");
|
Console.WriteLine("Connected");
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user