Json Beacon

Dette eksempel illustrerer hvordan man kan generere json output på seriel porten, og er tænkt som en en stub der kan bruges til at arbejde med seriel input på en en anden computer, f.eks. vha. node.js.

#include <ArduinoJson.h>

const int WAIT_MS_MIN = 500;
const int WAIT_MS_MAX = 8000;
const unsigned char TAG_COUNT = 5;

char* tagIds[TAG_COUNT] = {
  "4B 61 73 70 65 72 36 37 38 39 3A 3B",
  "E2 00 00 1B 63 15 02 48 16 00 DB 24",
  "E2 00 00 1B 63 15 02 48 17 00 DA F8",
  "E2 00 00 1B 63 15 02 48 17 20 DA F4",
  "E2 00 00 1B 63 15 02 48 15 90 DB 2C",
};

int pinOne = 2;
int pinTwo = 3;

void setup() {
  Serial.begin(115200);

   pinMode(pinOne, INPUT_PULLUP);
   pinMode(pinTwo, INPUT_PULLUP);
}

void loop() {
  int waitTime = random(WAIT_MS_MIN, WAIT_MS_MAX);
  int tagIdIndex = random(0, TAG_COUNT);

  bool isRandom = true;

  if(!digitalRead(pinOne)){
    tagIdIndex = 0;
    isRandom = false;
    waitTime = 300;
  }

  if(!digitalRead(pinTwo)){
    tagIdIndex = 1;
    isRandom = false;
    waitTime = 150;
  }

  DynamicJsonDocument doc(1024);
  // Insert some debugging information
  doc["isRandom"] = isRandom;
  doc["waitTime"] = waitTime;
  doc["tagIdIndex"] = tagIdIndex;
  // Insert the selected tag ID
  doc["tagId"] = tagIds[tagIdIndex];
  
  serializeJson(doc, Serial);

  Serial.println();
  delay(waitTime);
}

Der vælges en tilfældig værdi i tagIds arrayet, som så serialiseres som json sammen med oplysning om index og delay tiden, og udskrives på serielporten med tilfældige tidsintervaller.

Det er også mulighed for at vælge 2 bestemte tags ved at trække input pin 2 eller 3 lav, ved fysisk at forbinde til GND.

NB! Serielporten er sat til at køre 115200 Baud.

For nemt at kunne arbejde med JSON i Arduino koden benyttes biblioteket Arduino JSON. Derfor er det nødvendigt at installere dette på udviklingsmaskinen, inden denne sketch kan kompileres, det klares via. Arduino Library Manager, se hvordan du installerer det her.

Eksempel på output

Output på serielporten kommer til at se ca. sådan ud. Bemærk at det er kopieret fra Serial Monitor i Arduino IDE, og timestamps er slået til, derfor er der et tidsstempel på alle linier i output. Tidstempler, delay intervaller og rækkefølgen af tagId’er vil være forskellig for hver kørsel, da de bliver genereret tilfældigt.

21:00:56.034 -> {"waitTime":2492,"tagIdIndex":2,"tagId"B 63 15 02 48 17 00 DA F8"}
21:00:56.034 -> {"waitTime":2307,"tagIdIndex":4,"tagId":"E2 00 00 1B 63 15 02 48 15 90 DB 2C"}
21:00:58.350 -> {"waitTime":3073,"tagIdIndex":3,"tagId":"E2 00 00 1B 63 15 02 48 17 20 DA F4"}
21:01:01.410 -> {"waitTime":6930,"tagIdIndex":2,"tagId":"E2 00 00 1B 63 15 02 48 17 00 DA F8"}
21:01:08.346 -> {"waitTime":3044,"tagIdIndex":3,"tagId":"E2 00 00 1B 63 15 02 48 17 20 DA F4"}
21:01:11.414 -> {"waitTime":5923,"tagIdIndex":4,"tagId":"E2 00 00 1B 63 15 02 48 15 90 DB 2C"}
21:01:17.328 -> {"waitTime":4940,"tagIdIndex":0,"tagId":"4B 61 73 70 65 72 36 37 38 39 3A 3B"}
21:01:22.256 -> {"waitTime":2492,"tagIdIndex":2,"tagId":"E2 00 00 1B 63 15 02 48 17 00 DA F8"}
21:01:24.769 -> {"waitTime":5987,"tagIdIndex":3,"tagId":"E2 00 00 1B 63 15 02 48 17 20 DA F4"}

Materiale