Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Pavlov's Kat: IoT-dinertimer om je kat te trainen

Onderdelen en benodigdheden

Arduino MKR IoT Bundle 1

Apps en online diensten

  • Telegram

Over dit project

Let op: Deze tutorial is mogelijk verouderd, ga hier voor een actuele versie.

Als je ooit geprobeerd hebt een kat te trainen, weet je hoe moeilijk dat is. Katten zijn hun eigen meester, maar nu heb je de kans om de kat je bidding te laten doen met dit IoT-apparaat.

Welkom bij Pavlov's Kat Experiment!

In dit project leer je je kat leren wanneer het (en wanneer niet) dinnertijd is, met niets anders dan de componenten uit de MKR IoT Bundle en wat karton.

En we weten allemaal dat katten al van kartondozen houden!

Elke keer dat de kat een bepaalde melodie hoort, krijgt het voedsel. Een lichtsensor detecteert de aanwezigheid van de kat. Een andere melodie doet niets. Zie je hoe dit werkt?

Je kunt de voortgang van je kat in de gaten houden en de voeruitgifte-snelheid instellen vanaf je telefoon. Zodra je tevredenstellende statistieken hebt bereikt, is het tijd om de sensor om te bouwen tot een draagbare. Je kat zou je dan moeten volgen als je dat piepgeluid maakt.

Disclaimer: Geen katten zijn gewond tijdens de ontwikkeling van dit experiment. Ook geen garantie dat de kat het voedsel op eet, maar je snapt het idee, toch?

In een notendop

Je kunt je eigen voeruitgifte bouwen door deze eenvoudige stapsgewijze instructies te volgen. De uitgifte is eigenlijk gewoon karton en een servomotor met wat Arduino-magie.

Met een messagingdienst genaamd Telegram kun je de hoeveelheid voer instellen en de melodijen afspelen met de buzzer.

Een lichtsensor detecteert of de kat gereageerd heeft op de melodie en bij het voer is gekomen.

Pro Tip: Je kunt een webpagina hosten op de MKR1000 en de verzamelde data in een handige tabel weergeven.

Componenten

  • Servomotor
  • Fototransistor
  • 220 ohm weerstand
  • Buzzer
Pavlov s Kat: IoT-dinertimer om je kat te trainen

Leerdoelen

In dit experiment leer je hoe je:

  • Telegram Bots beheert met een aangepast toetsenbord
  • Webserver-functionaliteit instelt en beheert vanaf de MKR1000 zelf. #ProTip

Pro Tips zijn nuttige maar niet strikt noodzakelijke stappen die een laag complexiteit toevoegen.

Wil je meer weten?

Deze tutorial is onderdeel van een reeks experimenten die je vertrouwd maken met de MKR1000 en IoT. Alle experimenten kunnen gebouwd worden met de componenten uit de MKR IoT Bundle.

  • I Love You Pillow
  • Puzzle Box
  • Pavlov's Kat
  • The Nerd
  • Plant Communicator

Telegram en Arduino

Telegram is een populaire messaging-app voor zowel mobiel als desktop. Naast chatten met vrienden stelt het ons ook in staat om handige en krachtige chatbots te maken!

De TelegramBot-bibliotheek voor Arduino geeft ons een gemakkelijke manier om de logica achter de chatbot te implementeren.

Om te leren hoe je een bot maakt en basisfunctionaliteiten beheert, bekijk de I Love You Pillow tutorial.

Je eigen aangepaste toetsenbord maken

Telegram stelt ons in staat om een aangepast toetsenbord te maken voor snelle antwoorden. Dit betekent dat wanneer je met een bot praat, een bepaalde selectie knoppen wordt getoond in plaats van het standaard toetsenbord. Je kunt die knoppen eenvoudig aanpassen en de gebruikerservaring van je apparaat verbeteren.

Ons aangepaste toetsenbord ziet er zo uit:

Pavlov s Kat: IoT-dinertimer om je kat te trainen

We gebruiken de eerste rij knoppen om de melodie af te spelen en voer uit te geven, terwijl de tweede rij gebruikt wordt om de snelheid van de servomotor in te stellen en dus de hoeveelheid voer die uitgegeven wordt.

Om een aangepast toetsenbord te maken, declareren we het eerst:

TelegramKeyboard keyboard_one;

Dan definiëren we de rijen:

const char* row_one[] = {MusicAndFood, MusicNoFood};
const char* row_two[] = {OnePortion, TwoPortion, ThreePortion};

En ten slotte wijzen we de rijen toe aan het toetsenbord:

keyboard_one.addRow(row_one, 2); // tweede argument is lengte van de rij
keyboard_one.addRow(row_two, 3);

Onthoud dat een emoji met UNICODE verstuurd moet worden. Bijvoorbeeld voor een hart-emoji: \U00002764.

De volledige lijst met unicode-emoji-codes vind je hier. Dit betekent dat we onze knoppen als volgt definiëren:

const char* MusicAndFood = "\U0001F3B6 + \U0001F36A"; // Noot + Koekje
const char* MusicNoFood = "\U0001F3B6 NO \U0001F36A"; // Noot GEEN Koekje
const char* OnePortion = "\U0001F408"; // KAT
const char* TwoPortion = "\U0001F408 \U0001F408"; // 2 KATTEN
const char* ThreePortion = "\U0001F408 \U0001F408 \U0001F408"; // 3 KATTEN

De complete sketch

#include <WiFi101.h>
#include <SPI.h>
#include <TelegramBot.h>

const char* ssid = SECRET_SSID;
const char* password = SECRET_PSWD;
const char BotToken[] = SECRET_BOT_TOKEN;

WiFiSSLClient client;
TelegramBot bot(BotToken, client);
TelegramKeyboard keyboard_one;
String OldChatId = "";

void setup() {
  Serial.begin(115200);
  delay(3000);
  Serial.print("Connecting Wifi: ");
  Serial.println(ssid);
  while (WiFi.begin(ssid, password) != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println("");
  Serial.println("WiFi connected");

  const char* MusicAndFood = "\U0001F3B6 + \U0001F36A";
  const char* MusicNoFood = "\U0001F3B6 NO \U0001F36A";
  const char* OnePortion = "\U0001F408";
  const char* TwoPortion = "\U0001F408 \U0001F408";
  const char* ThreePortion = "\U0001F408 \U0001F408 \U0001F408";

  const char* row_one[] = {MusicAndFood, MusicNoFood};
  const char* row_two[] = {OnePortion, TwoPortion, ThreePortion};
  keyboard_one.addRow(row_one, 2);
  keyboard_one.addRow(row_two, 3);
  bot.begin();
}

void loop() {
  message m = bot.getUpdates();
  if (m.chat_id != 0) {
    OldChatId = m.chat_id;
    Serial.println(m.text);
    bot.sendMessage(m.chat_id, "Hello !", keyboard_one);
  }
  delay(1000);
}

Helaas is de manier waarop de bot emojis stuurt niet dezelfde als hoe ze ontvangen worden. Het EchoBot-voorbeeld is een gemakkelijke manier om te zien hoe bots emojis ontvangen.

De emojis die we gebruiken worden bijvoorbeeld als volgt ontvangen:

ud83cudfb6 // Melodie
ud83cudf6a // Koekje
ud83dudc08 // Kat

De kat detecteren!

Om de aanwezigheid van de kat te detecteren gebruiken we een fototransistor, die de lichtintensiteit kan meten en dus of er iemand ervoorbij is gegaan.

Pavlov s Kat: IoT-dinertimer om je kat te trainen

Let op dat we een 220 ohm weerstand gebruikten.

Om waarden van de sensor te lezen hebben we alleen analogRead(A6) nodig.

Omdat we geïnteresseerd zijn in het detecteren van de kat alleen na de melodie, en dat maar voor een bepaalde tijd, kunnen we de volgende logica gebruiken:

unsigned long timer;
bool startDetecting = true;
int threshold = 200; // willekeurige waarde

void setup() {
  timer = millis();
  Serial.begin(9600);
}

void loop() {
  if (startDetecting) {
    int value = analogRead(A6);
    if (value < threshold) {
      Serial.println("kat gedetecteerd!");
      startDetecting = false;
    } else if (millis() - timer > 120000) {
      Serial.println("geen kat gedetecteerd in de afgelopen twee minuten");
      startDetecting = false;
    }
  }
}

Let op dat we de millis() functie gebruiken om een timer in te stellen. Millis() geeft de tijd in milliseconden sinds de board opgestart is. We kunnen het gebruiken om timers in te stellen en events te triggeren na een bepaalde tijd.

We gebruiken ook een drempelwaarde om te bepalen of de kat gedetecteerd is. Die drempel is willekeurig, je kunt hem aanpassen aan je lichtomstandigheden.

Het liedje afspelen

Om het liedje af te spelen gebruiken we de buzzer en de tone() functie.

Pavlov s Kat: IoT-dinertimer om je kat te trainen

We gebruiken een licht aangepaste versie van het standaardvoorbeeld toneMelody. Je vindt het in het dropdown-menu: examples > digital > toneMelody.

De servomotor toevoegen

De servo wordt gebruikt om het doosje open te maken en voer te leveren.

Let op dat we een variabele int PortionAmount = 1; gebruiken om de tijd in te stellen dat de servo 90 graden gedraaid blijft. We kunnen deze waarde via Telegram wijzigen.

Sluit de servo aan op pin 7 en upload deze sketch om te zien hoe het werkt.

#include <Servo.h>
Servo myservo;
int pos = 0;
int PortionAmount = 1;

void setup() {
  myservo.attach(7);
}

void loop() {
  moveServo();
  delay(2000);
}

void moveServo() {
  Serial.println("moving servo");
  for (pos = 0; pos <= 90; pos += 1) {
    myservo.write(pos);
    delay(15);
  }
  delay(PortionAmount * 300);
  for (pos = 90; pos >= 0; pos -= 1) {
    myservo.write(pos);
    delay(15);
  }
}

#ProTip: Een webserver toevoegen

Eén van de krachtigste functionaliteiten van de MKR1000 is de Access Point Mode.

Hiermee kunnen we een webpagina hosten op de MKR1000 die we kunnen bereiken via het IP-adres van het bord, mits we op hetzelfde netwerk zitten.

We gebruiken dit om de verzamelde data van de voeruitgifte weer te geven.

Pavlov s Kat: IoT-dinertimer om je kat te trainen

Deze stap vereist basiskennis van HTML en CSS (of veel vertrouwen in de voorbeeldsketch. Je kunt het basale webserver-voorbeeld bekijken bij: > example > WiFi101 > AP_SimpleWebServer).

We activeren de access point mode door een specifiek woord naar onze Telegram Bot te sturen, die reageert met de link naar de webpagina. Vervolgens wordt de Telegram-client losgekoppeld en de webserver gestart.

else if(m.text == "Server"){
  IPAddress ip = WiFi.localIP();
  web_server_mode = true;
  String message = "To see the webpage go to https://" + IpToString(ip);
  bot.sendMessage(m.chat_id, message, keyboard_one);
  telegram_client.stop();
  delay(1000);
  server.begin(); // start webserver op poort 80
}

De webpagina bevat een knop die de webserver-modus uitschakelt en teruggaat naar Telegram-client:

if (currentLine.endsWith("GET /BACKBUTTON")) {
  web_server_mode = false;
  client.stop();
  delay(1000);
  bot.begin();
  bot.sendMessage(OldChatId, "Back online !", keyboard_one);
}

Elke keer dat de katdetectie eindigt, wordt een nieuwe cel aan de tabel toegevoegd met de verzamelde data: of voer uitgegeven was, of de kat binnen twee minuten opduikte en hoe lang het duurde om de uitgifte te bereiken.

AddTableCell(food/noFood, Yes/No, TimeValue);

Daarna wordt de string met alle tabelcellen bijgewerkt en geïntegreerd in de rest van de hoofdtml.

table_cells += cell;
html = html_1 + table_cells + html_2;

Bekijk het finale Pro-voorbeeld om te zien hoe al deze functionaliteiten geïntegreerd worden!

Tip: Als je wilt dat je data een reset van het bord overleeft, bekijk de Flash Storage library of check het Nerd-project!

Code

Complete sketch

#ProTips complete sketch

Aangepaste onderdelen en behuizingen

2mm karton: pavlovcase_ShVm1OJRIF.dxf

Schema's

Pavlov s Kat: IoT-dinertimer om je kat te trainen

Productieproces

  1. Shop.Cat.Com: Uw Één-Stop Bron voor Apparatuur, Bijlagen en Gereedschappen
  2. Cat® Machines Optimaliseren: De Ultieme My.Cat.com Gids
  3. De Wetenschap en Industrie van Diepvriesgroenten: Van Oogst tot Tafel
  4. TV-Diners: Geschiedenis, Productie en Toekomstige Innovaties
  5. CT (CAT) Scanners: Evolutie, Ontwerp en de Toekomst van 3-D Medische Beeldvorming
  6. De Geschiedenis en Impact van Kattenbak: Van Klei tot Industrie
  7. De Complete Gids voor Vriesgedroogd Voedsel: Bewaring, Productie en Toekomstige Trends
  8. Huisdiervoederproductie: Van Ingrediënten tot Regulering – Een Complete Gids
  9. Vielzijdige Voedselautomaten: Van Snacks tot Verse Boterhammen
  10. Voedselproductie veiliger en sneller maken met automatisering
  11. Metaal-Detecteerbare Kunststoffen: Voedselveiligheid Verbeteren in de Industrie