the-cup/the-cup.ino
Christophe Robillard 212eaca10d use SS_PIN constant
2025-11-01 17:44:03 +01:00

144 lines
4.4 KiB
C++

/* Pin layout used:
* -----------------------------------------------------------------------------------------
* MFRC522 ESP8266
* Reader/PCD Feather Huzzah
* Signal Pin Pin
* -----------------------------------------------------------------------------------------
* SPI SS 1 SDA(SS) SDA/4
* SPI SCK SCK 14 / SCK
* SPI MOSI MOSI 13 / MOSI
* SPI MISO MISO 12 / MISO
*
*/
#include <WiFiManager.h> // https://github.com/tzapu/WiFiManager
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>
// #include "certs.h"
#include <MFRC522v2.h>
#include <MFRC522DriverSPI.h>
#include <MFRC522DriverPinSimple.h>
#include <MFRC522Debug.h>
#define LED_PIN 16
#define SS_PIN 4
MFRC522DriverPinSimple ss_1_pin(SS_PIN); // Configurable, take an unused pin, only HIGH/LOW required, must be different to SS 2.
MFRC522DriverSPI driver_1{ss_1_pin};
MFRC522 reader{driver_1}; // Create MFRC522 instance.
void setup() {
// WiFi.mode(WIFI_STA); // explicitly set mode, esp defaults to STA+AP
// it is a good practice to make sure your code sets wifi mode how you want it.
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
displaySuccess();
//WiFiManager, Local intialization. Once its business is done, there is no need to keep it around
WiFiManager wm;
// reset settings - wipe stored credentials for testing
// these are stored by the esp library
// wm.resetSettings();
// Automatically connect using saved credentials,
// if connection fails, it starts an access point with the specified name ( "AutoConnectAP"),
// if empty will auto generate SSID, if password is blank it will be anonymous AP (wm.autoConnect())
// then goes into a blocking loop awaiting configuration and will return success result
bool res;
// res = wm.autoConnect(); // auto generated AP name from chipid
// res = wm.autoConnect("AutoConnectAP"); // anonymous ap
res = wm.autoConnect("KLUK"); // password protected ap
if(!res) {
Serial.println("Failed to connect");
displayError();
// ESP.restart();
}
else {
//if you get here you have connected to the WiFi
Serial.println("connected...yeey :)");
displaySuccess();
}
reader.PCD_Init(); // Init each MFRC522 card.
}
void loop() {
auto client = std::make_unique<BearSSL::WiFiClientSecure>();
if (reader.PICC_IsNewCardPresent() && reader.PICC_ReadCardSerial()) {
// Halt PICC.
reader.PICC_HaltA();
// Stop encryption on PCD.
reader.PCD_StopCrypto1();
client->setInsecure();
HTTPClient https;
Serial.print("[HTTPS] begin...\n");
// configure traged server and url
https.begin(*client, "https://mood.robiweb.net/rfid_tags"); // HTTP
https.addHeader("Content-Type", "application/json");
char str[32] = "";
array_to_string(reader.uid.uidByte, 4, str); //Insert (byte array, length, char array for output)
Serial.println(str); //Print the output uid string
// start connection and send HTTP header and body
int httpCode = https.POST("{\"identifier\":\"" + String(str) + "\"}");
Serial.print("httpCode: ");
Serial.print(httpCode);
// httpCode will be negative on error
if (httpCode > 0) {
// HTTP header has been send and Server response header has been handled
// file found at server
// if (httpCode == HTTP_CODE_OK) {
if (httpCode == HTTP_CODE_CREATED) {
displaySuccess();
} else {
displayError();
}
}
https.end();
Serial.print("[HTTPS] ended...\n");
}
}
void array_to_string(byte array[], unsigned int len, char buffer[]) {
for (unsigned int i = 0; i < len; i++)
{
byte nib1 = (array[i] >> 4) & 0x0F;
byte nib2 = (array[i] >> 0) & 0x0F;
buffer[i*2+0] = nib1 < 0xA ? '0' + nib1 : 'A' + nib1 - 0xA;
buffer[i*2+1] = nib2 < 0xA ? '0' + nib2 : 'A' + nib2 - 0xA;
}
buffer[len*2] = '\0';
}
void displayError() {
for (unsigned int i = 0; i < 6; i++)
{
digitalWrite(LED_PIN, HIGH);
delay(600);
digitalWrite(LED_PIN, LOW);
delay(300);
}
}
void displaySuccess() {
digitalWrite(LED_PIN, HIGH);
delay(1000);
digitalWrite(LED_PIN, LOW);
delay(300);
}