Innehållsförteckning:
Video: BBQ Pi (med datavisualisering!): 4 steg (med bilder)
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:39
Introduktion
Grillning avser oftast den långsamma processen med att använda indirekt värme för att laga ditt favoritkött. Även om denna matlagningsmetod är oerhört populär-särskilt i USA-har den vad som kan anses vara en ganska allvarlig svaghet: det kräver timmar av halvklar uppmärksamhet för att övervaka temperaturen på din grop och mat. Ange: Raspberry Pi.
Det ursprungliga projektet
Den ursprungliga källan för detta projekt hittar du här: https://old.reddit.com/r/raspberry_pi/comments/a0… Kärnan i det är att reddit -användare Produkt kunde vidarebefordra mat- och groptemperaturdata från relativt billiga, kommersiellt tillgängliga trådlösa termometrar till en Raspberry Pi (som hade fäst en liten RF -modul på sina GPIO -stift). I det ursprungliga projektet (länkad ovan) lagrade Produkt sin data i en sqlite -databas och visades på en lokalt värd apache2 php -webbplats.
Denna lösning löser redan det ursprungliga problemet som berördes i introduktionen av den här bloggen: du kan nu övervaka din mat & groptemperatur på distans med en webbläsare. Men tänk om vi ville utöka detta? Ange: GridDB.
Tillbehör
Hallon Pi4
SUNKEE 433Mhz Superheterodyne trådlös mottagarmodul
Steg 1: GridDB Web API & FluentD
När jag såg detta projekt var min första tanke - efter den första våg av spänning - att tänka på sätt att utöka funktionaliteten. Genom att använda GridDB och dess Grafana -plugin försökte jag visualisera mina mat- och gropdata. Utöver det ville jag skapa Grafana -anteckningar för att söka efter onormala datapunkter - kan inte ha något förkolnat kött!
För att komma igång behövde jag använda C -koden från det ursprungliga projektet för att läsa data som kom in från den trådlösa termometern och lägga upp den i min GridDB -server. För att få detta igång, snurrade jag upp en GridDB -server på Azure med en virtuell CentOS -dator. Det enklaste sättet att dela data från vår kantmaskin (Raspberry Pi) till vår molnserver var via GridDB Web API. Så på den videon ställde jag in GridDB: s WebAPI tillsammans med Fluentd och den medföljande GridDB -kontakten.
Innan jag faktiskt skickade data till molnet behövde jag skapa grundschemat för min BBQ Pi -behållare. Datauppsättningen som kommer in är extremt enkel: vi har två temperatursensorer, en kock -id och naturligtvis tidsstämpeln. Så vårt schema ser ut så här:
tidsserier = gridstore.put_container ("bbqpi", [("tid", griddb. GS_TYPE_TIMESTAMP), ("cookid", griddb. GS_TYPE_INT), ("probe1", griddb. GS_TYPE_INT), ("probe2", griddb. GS_TYPE_INT)], griddb. GS_CONTAINER_TIME_
För att skapa denna tidsseriebehållare använde jag helt enkelt WebAPI (port 8080):
curl -X POST --basic -u admin: admin -H "Content -type: application/json" -d
'{"container_name": "bbqpi", "container_type": "TIME_SERIES", / "rowkey": true, "columns": [ {"name": "time", "type": "TIMESTAMP"}, {"name": "cookid", "type": "INTEGER"}, {"name": "probe1", "type": "INTEGER"}, {"name": "probe2", "type": "INTEGER"}]} '\ https:// localhost: 8080/griddb/v2/defaultCluster/dbs/public/containers
Med behållaren skapad behövde jag använda Fluentd (port 8888) för att lägga upp faktiska data i vår behållare. Här är ett CURL -kommando som lägger ut några dummy -data:
curl -X POST -d 'json = {"date": "2020-01-01T12: 08: 21.112Z", "cookid": "1", "probe1": "150", "probe2": "140" } 'https:// localhost: 8888/griddb
Därifrån behövde jag lägga till den ursprungliga koden för att skicka en HTTP POST -begäran när vår Pi läste data från vår grop (ungefär en gång var ~ var 12: e sekund).
Som en sidnot: att skriva den här koden lärde mig att uppskatta hur orimligt C -språket kan vara:
int postData (char time , int cookid, int probe1, int probe2, char url )
{CURL *curl; CURLcode res; / * I windows kommer detta att initiera winsock -grejerna */ curl_global_init (CURL_GLOBAL_ALL); char errbuf [CURL_ERROR_SIZE] = {0,}; röding agent [1024] = {0,}; char json [1000]; snprintf (json, 200, "json = {" datum / ": \"%s.112Z / ", \" cookid / ": \"%d / ", \" probe1 / ": \"%d / ", / "probe2 \": / "%d \"} ", tid, cookid, probe1, probe2); / * få ett curlhandtag */ curl = curl_easy_init (); if (curl) { /* Ange först webbadressen som ska ta emot vårt POST. Denna URL kan lika gärna vara en https:// URL om det är det som ska ta emot data. */ snprintf (agent, sizeof agent, "libcurl/%s", curl_version_info (CURLVERSION_NOW)-> version); agent [sizeof agent - 1] = 0; curl_easy_setopt (curl, CURLOPT_USERAGENT, agent); curl_easy_setopt (curl, CURLOPT_URL, url); curl_easy_setopt (curl, CURLOPT_USERNAME, "admin"); curl_easy_setopt (curl, CURLOPT_PASSWORD, "admin"); curl_easy_setopt (curl, CURLOPT_VERBOSE, 1L); curl_easy_setopt (curl, CURLOPT_ERRORBUFFER, errbuf); curl_easy_setopt (curl, CURLOPT_POSTFIELDS, json); / * Utför begäran, res får returkoden */ res = curl_easy_perform (curl); if (res! = CURLE_OK) {size_t len = strlen (errbuf); fprintf (stderr, "\ nlibcurl: (%d)", res); if (len) fprintf (stderr, "%s%s", errbuf, ((errbuf [len - 1]! = '\ n')? "\ n": "")); fprintf (stderr, "%s / n / n", curl_easy_strerror (res)); gå till städning; } sanering: curl_easy_cleanup (curl); curl_global_cleanup (); returnera 0; }}
Med den här funktionen skriven behövde jag bara att den skulle köras samtidigt som sqlite -data publicerades:
if (goodData == 1) {
if (last_db_write == 0 || (secs-last_db_write> = 10)) {snprintf (sql, 100, "INSERT INTO readings (cookid, time, probe1, probe2) VALUES (%d, '%s',%d, %d); ", cookID, buff, probe1, probe2); printf ("%s / n", sql); rc = sqlite3_exec (db, sql, callback, 0, & zErrMsg); if (rc! = SQLITE_OK) {printf ("SQL -fel: %s / n", zErrMsg); } annat {last_db_write = sek. } char url = "https://xx.xx.xx.xx: 8888/griddb"; postData (buff, cookID, probe1, probe2, url); }}
För att säkerställa att dina data faktiskt sätts in i din server kan du köra följande kommando för att fråga din databas och se resultaten:
curl -X POST --basic -u admin: admin -H "Content -type: application/json" -d '{"limit": 1000}' https:// localhost: 8080/griddb/v2/defaultCluster/dbs/ public/containers/bbqpi/rader
Steg 2: Grafana
Med koden på plats, nu när vi använder den ursprungliga webbportalen för att starta en "kock", kommer vi samtidigt att lagra våra temperaturdata i vår GridDB -server.
Nästa steg blir att visualisera våra data med Grafana. För att göra det följde vi informationen från den här bloggen: här. Det fina med den här implementeringen är att det är extremt lätt att se våra data kartlagda i ett snyggt diagram. Det lägger också till kommentarer.
Anteckningarna som diskuteras i bloggen gör det extremt lätt för oss att övervaka när något går fel med antingen vår mat eller själva gropen. I mitt fall lagade jag nötkött med kort revben. Med dem ville jag inte att temperaturen i gropen skulle växa bortom 275 grader Fahrenheit. Om jag såg temperaturen gå utöver det kunde jag stänga av en brännare och låta värmen sjunka igen:
Jag hade en liknande regel för att sensorn faktiskt skulle hålla koll på själva maten: om maten fick en inre temperatur på 203 grader Fahrenheit var revbenen klara. Du kan se den enda kommentaren i slutet av kocken här:
Sammantaget tog kocken mig ungefär ~ 4 timmar eller så, men den här typen av inställningar skulle verkligen utmärka sig om jag lagade något som skulle ha krävt ännu mer tid i grillen (tänk på en lågt långsam rök som varar ~ 12 timmar). Trots det tror jag värdet om det här verktyget är lätt uppenbart: att kunna logga dina livsmedelsresultat och sedan jämföra det med tidigare kockar betyder att din grillning långsamt blir bättre med tiden eftersom du kan använda data för att se vad som fungerar och vad som inte fungerar 't.
Steg 3: Maten
Detta var första gången jag någonsin har gjort nötkött kort revben; för smaksättning använde jag helt enkelt salt, svartpeppar och vitlökspulver. Trots vissa problem med att brännaren blev för hög för en liten bit där i början kom revbenen fantastiskt bra. Ta en titt:
Steg 4: Slutsats
Till slut kom maten fantastiskt bra, sensorerna, GridDB och Grafana arbetade alla underbart och vi fick värdefull information om hur man lagar dessa saker igen för nästa gång vi vill imponera på några vänner.
Rekommenderad:
Ta fantastiska bilder med en iPhone: 9 steg (med bilder)
Ta fantastiska bilder med en iPhone: De flesta av oss har en smartphone med oss överallt nuförtiden, så det är viktigt att veta hur du använder din smartphone -kamera för att ta fantastiska bilder! Jag har bara haft en smartphone i ett par år, och jag har älskat att ha en bra kamera för att dokumentera saker jag
Hur: Installera Raspberry PI 4 Headless (VNC) med Rpi-imager och bilder: 7 steg (med bilder)
Hur: Installera Raspberry PI 4 Headless (VNC) med Rpi-imager och bilder: Jag planerar att använda denna Rapsberry PI i ett gäng roliga projekt tillbaka i min blogg. Kolla gärna in det. Jag ville börja använda mitt Raspberry PI men jag hade inte ett tangentbord eller en mus på min nya plats. Det var ett tag sedan jag installerade en hallon
BBQ temperatur- och köttsensor på ESP8266 med display: 5 steg (med bilder)
BBQ temperatur- och köttsensor på ESP8266 med display: I denna instruktionsbok visar jag dig hur du gör din egen version av ett grillverktyg som mäter den aktuella temperaturen i din grill och slår på en fläkt för att tända den vid behov. Utöver detta finns det också en köttkärntemperaturgivare som
Hur man tar isär en dator med enkla steg och bilder: 13 steg (med bilder)
Hur man tar isär en dator med enkla steg och bilder: Detta är en instruktion om hur man demonterar en dator. De flesta av de grundläggande komponenterna är modulära och lätt att ta bort. Det är dock viktigt att du är organiserad kring det. Detta hjälper dig att inte förlora delar, och även för att göra ommonteringen
Ciclop 3d Scanner My Way Steg för steg: 16 steg (med bilder)
Ciclop 3d Scanner My Way Steg för steg: Hej alla, jag ska inse den berömda Ciclop 3D -scannern.Alla steg som förklaras väl på det ursprungliga projektet är inte närvarande.Jag gjorde några korrigeringar för att förenkla processen, först Jag skriver ut basen, och än så återställer jag kretskortet, men fortsätter