色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用 Windows 10 UWP制作一個扎啤機

科技觀察員 ? 來源:Kevin D Wolf ? 作者:Kevin D Wolf ? 2022-09-07 15:24 ? 次閱讀

使用 Windows 10 UWP 應(yīng)用程序的強大功能來控制和監(jiān)控啤酒桶,讓您的飲料保持涼爽、新鮮和隨時可用。

注意:首先,這個項目絕不會提倡使用或濫用酒精,這完全取決于用戶在這個 kegerator 中的內(nèi)容是什么飲料。

這個項目的誕生是為了更好地管理扎啤機。扎啤機的基本原理是保持飲料低溫以及將飲料碳酸保持在一定的 PSI 下。此外,僅僅給自己倒一杯冷飲,你根本不知道桶里還剩多少。

所以這個項目的目標是:

保持飲料的一致溫度,確保飲料不會過熱或過冷并凍結(jié)

確保將可接受的碳酸化量應(yīng)用于小桶以保持最佳風味

跟蹤每個桶中的飲料量并提供視覺反饋,以確保為大型比賽準備充足的飲料。

跟蹤用于碳酸飲料的罐中剩余的二氧化碳量

基本電子元件及其用途:

冷藏柜用于冷卻裝置并提供框架以制作精美的家具

Raspberry PI 2 Running Windows 10 IoT core 被用作操作的大腦

小型郵資秤用于測量每個小桶和二氧化碳罐的重量,這些郵資秤移除了電子設(shè)備,并在秤中內(nèi)置了稱重傳感器放大器和小型 Arduino。這些秤將通過 I2C 與 Raspberry PI 2 通信(稍后會詳細介紹)

設(shè)備上安裝了 5 個數(shù)字溫度傳感器,一個在冷凍柜的底部,一個安裝在頂部的下側(cè),一個安裝在水龍頭把手所在的塔架上(稍后會詳細介紹)和一個安裝在設(shè)備外部以測量環(huán)境溫度。這些溫度傳感器連接到一個小型 Arduino,還通過 I2C 與 Raspberry PI 2 通信

霍尼韋爾壓力傳感器連接到用于為小桶提供碳酸化作用的空氣管路上。雖然 PSI 的調(diào)整是手動的(目前),但這將提供一個準確的計量器來確定桶中的二氧化碳量。

5V 電源用于為 Raspberry PI2 供電。選擇了更大的版本(提供高達 6 安培),因此它也可以為可尋址的 LED 燈條供電。

一個簡單的繼電器與壓縮機電源串聯(lián)。使用這個繼電器,可以從壓縮機施加和斷開電源,然后壓縮機將依次控制 kegerator 的溫度(稍后會詳細介紹)

云連接

Ultimate Kegerator 包含一個 Web 服務(wù)器,允許通過 REST 服務(wù)進行遠程配置以及當前狀態(tài)的簡單靜態(tài)視圖。可以通過http://slsys.homeip.net:9501訪問該網(wǎng)站 。

此外,Ultimate Kegerator 將其重要統(tǒng)計數(shù)據(jù)上傳到 Windows Azure 事件中心。雖然無法使用標準 Nuget 包與事件中心對話,但是你可以使用 Windows Embedded MVP Paolo Patierno提供的易于實現(xiàn)的庫,網(wǎng)址為

https://www.nuget.org/packages/AzureSBLite/

數(shù)據(jù)被推送到WindowsAzure上的事件中心:

poYBAGMYRkaAZ7a_AACr1RTuysU158.png

通過流分析進行最終處理

WindowsAzure上的流分析正在處理的數(shù)據(jù):

pYYBAGMYRl6AZ_8KAAD3PCI0Ixo975.png

流分析的最終計劃是:

1) 監(jiān)控并通知溫度是否過熱或過冷

2) 監(jiān)測并通知 CO2 罐何時過低

3) 監(jiān)測并通知 CO2 罐是否檢測到泄漏(重量逐漸減輕)

以下是組裝過程的一些附加圖片:

電子秤組裝

pYYBAGMYRlKASLq2AANiH83HwZ0441.png

稱重傳感器:

pYYBAGMYRmCAIeJZAAHZ_sZEhQw412.png

測試+5VDC 穩(wěn)壓器:

poYBAGMYRleATX53AAN07vv27_I878.png

在測試壓縮機繼電器時準備連接:

poYBAGMYRmWAOaN_AANkxhqAtYQ949.png

電源:

pYYBAGMYRmmAL74aAAPa_l7nfTM683.png

CPU

poYBAGMYRm2AF385AAQ1FhbjzMY148.png

連接溫度傳感器:

pYYBAGMYRnWAeHRZAANh4z2IWZg308.png

Arduino的最終封裝:

poYBAGMYRneAflQ7AALOJXET4Ng192.png

壓力傳感器及其+5VDC至+3.3VDC穩(wěn)壓器:

pYYBAGMYRoGAGyh8AAOHmCxKcww556.png

最終成果:

poYBAGMYRoOAUqofAANdyy8dido024.png

Kegerator Class:

using LagoVista.Common.Commanding;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using Windows.Devices.Enumeration;
using Windows.Devices.I2c;

namespace LagoVista.IoT.Common.Kegerator
{
public class Kegerator : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

private Models.Keg _keg1;
private Models.Keg _keg2;
private Models.Keg _keg3;
private Models.Keg _keg4;
private CO2.CO2Tank _co2Tank;

private Kegerator() { }

public List _devices = new List();

private void RaisePropertyChanged([CallerMemberName] string propertyName = null)
{
var eventHandler = this.PropertyChanged;
if (eventHandler != null)
{
eventHandler(this, new PropertyChangedEventArgs(propertyName));
}
}

private bool Set(ref T storage, T value, string columnName = null, [CallerMemberName] string propertyName = null)
{
if (object.Equals(storage, value)) return false;

storage = value;
this.RaisePropertyChanged(propertyName);
return true;
}

byte[] _scalesAddresses = { 0x43, 0x41, 0x40, 0x42 };

private const string I2C_CONTROLLER_NAME = "I2C1";

private Thermo.Temperatures _temperatures;
private Thermo.Controller _tempController;

private Scales.Scale _co2Scale;
private Dictionary _kegScales;

private CO2.PressureSensor _pressureSensor;
private LED.LEDManager _ledManager;

private REST.KegeratorServices _kegServices;

private static Kegerator _kegerator = new Kegerator();
public static Kegerator Instance { get { return _kegerator; } }

private CloudServices.EventHubClient _eventHubClient;

System.Threading.Timer _timer;


private bool _initialized = false;

public async Task Init()
{
if (!_initialized)
{
_initialized = true;
var selector = I2cDevice.GetDeviceSelector(I2C_CONTROLLER_NAME); /* Find the selector string for the I2C bus controller */
var deviceInfo = (await DeviceInformation.FindAllAsync(selector)).FirstOrDefault(); /* Find the I2C bus controller device with our selector string */

var deviceId = deviceInfo == null ? (string)null : deviceInfo.Id;
_temperatures = new Thermo.Temperatures(0x48);
await _temperatures.Init(deviceId);
_devices.Add(_temperatures);

_tempController = new Thermo.Controller();
_tempController.Init(_temperatures);
_devices.Add(_tempController);

_pressureSensor = new CO2.PressureSensor();
await _pressureSensor.Init(deviceId, TimeSpan.FromSeconds(1));
_devices.Add(_pressureSensor);

_co2Scale = new Scales.Scale(0x44);
await _co2Scale.Init(deviceId, TimeSpan.FromSeconds(1));
_devices.Add(_co2Scale);

_co2Tank = new CO2.CO2Tank(_co2Scale, TimeSpan.FromSeconds(2));
_co2Tank.Load();
_devices.Add(_co2Tank);

_kegScales = new Dictionary();

_eventHubClient = new CloudServices.EventHubClient(this, TimeSpan.FromSeconds(2));
_devices.Add(_eventHubClient);

for (var idx = 0; idx < 4; ++idx)
{
var scale = new Scales.Scale(_scalesAddresses[idx]);
await scale.Init(deviceId, TimeSpan.FromMilliseconds(500));
_kegScales.Add(idx, scale);
_devices.Add(scale);
}

_keg1 = new Models.Keg(1, _kegScales[0], TimeSpan.FromMilliseconds(500));
_keg1.Load();
_devices.Add(_keg1);
_keg2 = new Models.Keg(2, _kegScales[1], TimeSpan.FromMilliseconds(500));
_keg2.Load();
_devices.Add(_keg2);
_keg3 = new Models.Keg(3, _kegScales[2], TimeSpan.FromMilliseconds(500));
_keg3.Load();
_devices.Add(_keg3);
_keg4 = new Models.Keg(4, _kegScales[3], TimeSpan.FromMilliseconds(500));
_keg4.Load();
_devices.Add(_keg4);

DateInitialized = DateTime.Now.ToString();

Web.WebServer.Instance.StartServer();

_kegServices = new REST.KegeratorServices() { Port = 9500 };
_kegServices.EventContent += _kegServices_EventContent;
_kegServices.StartServer();

_timer = new System.Threading.Timer((state) =>
{
Refresh();
}, null, 0, 250);
}

}

private void _kegServices_EventContent(object sender, string e)
{
var parts = e.Split('/');
if (parts.Count() > 0)
{
switch (parts[1])
{
case "zero":
{
var scaleIndex = Convert.ToInt32(parts[2]);
_kegScales[scaleIndex].StoreOffset();
}
break;
case "cal":
{
var scaleIndex = Convert.ToInt32(parts[2]);
_kegScales[scaleIndex].CalibrationWeight = Convert.ToDouble(parts[3]);
_kegScales[scaleIndex].Calibrate();
}
break;
}
}
}

public void Refresh()
{
foreach (var device in _devices)
{
if (DateTime.Now > (device.LastUpdated + device.UpdateInterval))
device.Refresh();
}

LagoVista.Common.PlatformSupport.Services.DispatcherServices.Invoke(() =>
{
CurrentTimeDisplay = DateTime.Now.ToString();
RaisePropertyChanged("CurrentTimeDisplay");
});
}

public Thermo.Temperatures Temperatures { get { return _temperatures; } }


public Thermo.Controller TemperatureController { get { return _tempController; } }


private String _statusMessage;
public String StatusMessage
{
get { return _statusMessage; }
set { Set(ref _statusMessage, value); }
}

public List KegScales
{
get { return _kegScales.Values.ToList(); }
}

public void ToggleCompressor()
{
if (_tempController.IsCompressorOn)
_tempController.CompressorOff();
else
_tempController.CompressorOn();
}

public String DateInitialized
{
get;
set;
}

public String CurrentTimeDisplay
{
get;
set;
}

public Scales.Scale CO2Scale
{
get { return _co2Scale; }
}

public CO2.PressureSensor PressureSensor
{
get { return _pressureSensor; }
}


public Models.Keg Keg1 { get { return _keg1; } }
public Models.Keg Keg2 { get { return _keg2; } }
public Models.Keg Keg3 { get { return _keg3; } }
public Models.Keg Keg4 { get { return _keg4; } }

public CO2.CO2Tank CO2Tank { get { return _co2Tank; } }

public RelayCommand ToggleCompressorCommand { get { return new RelayCommand(ToggleCompressor); } }
}
}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • WINDOWS
    +關(guān)注

    關(guān)注

    4

    文章

    3549

    瀏覽量

    88792
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3276

    瀏覽量

    57732
  • DIY設(shè)計
    +關(guān)注

    關(guān)注

    2

    文章

    59

    瀏覽量

    19824
收藏 人收藏

    評論

    相關(guān)推薦

    Windows 10 IoT版本之間有什么區(qū)別?

    native和UWPapps與過去的Windows CE不同,Windows 10 IoT Core是Windows 10
    發(fā)表于 05-03 11:16

    安信Windows驅(qū)動開發(fā)教程:什么是通用 Windows 平臺 (UWP) 應(yīng)用程序?有什么功能?

    API 提供強大的 UI 和高級異步功能,這些功能非常適合聯(lián)網(wǎng)設(shè)備。 若要下載開始創(chuàng)建 UWP 應(yīng)用所需的工具,請參閱設(shè)置,然后編寫你的第一個應(yīng)用。Windows驅(qū)動開發(fā)定制UWP
    發(fā)表于 09-09 17:50

    Ubuntu今天正式以UWP應(yīng)用的身份上架Win10應(yīng)用商店

    Ubuntu今天正式以UWP應(yīng)用的身份上架Win10應(yīng)用商店。Windows Insider用戶升級到Win10秋季創(chuàng)意者更新預(yù)覽版Build 16190及以上就可以下載和安裝Ubun
    發(fā)表于 07-12 11:40 ?2254次閱讀

    騰控PLC的扎啤桶清洗的設(shè)計

     本文提出了種基于北京騰控科技有限公司T910系列PLC的并聯(lián)清洗方法,重新設(shè)計了扎啤桶清洗的結(jié)構(gòu),使得清洗效率有了很大的提高,有效克服了清洗效率低的問題。
    發(fā)表于 10-10 16:42 ?2次下載
    騰控PLC的<b class='flag-5'>扎啤</b>桶清洗<b class='flag-5'>機</b>的設(shè)計

    Windows 10虛擬進入免費試用階段,1月15日截止

    如果想創(chuàng)建UWP應(yīng)用程序,有比這更好的方法。首先,有Windows UWP社區(qū)工具包。這是
    發(fā)表于 11-28 09:08 ?1439次閱讀

    Windows 10 ARM筆記本20小時的長續(xù)航遭懷疑 高通出面解說

    高通和微軟共同推出的Windows 10 ARM筆記本具有超強的續(xù)航能力,但是長續(xù)航卻遭到了用戶的懷疑,認為僅使用Windows 10 UWP
    發(fā)表于 01-24 13:44 ?805次閱讀
    <b class='flag-5'>Windows</b> <b class='flag-5'>10</b> ARM筆記本20小時的長續(xù)航遭懷疑 高通出面解說

    Windows 10引入種全新的安裝包格式“MSIX”,支持所有程序格式

    Windows開發(fā)日峰會上,微軟意外宣布Windows 10將引入種全新的安裝包格式“MSIX”,可以視為現(xiàn)有MSI的升級版,支持所有程序格式。 據(jù)介紹,MSIX格式可以容納
    的頭像 發(fā)表于 03-18 08:10 ?6232次閱讀

    如何在Windows 10X上運行Win32應(yīng)用

    盡管微軟新推出的 Windows 10X 操作系統(tǒng)主要側(cè)重于 UWP 和 Web 應(yīng)用程序,但該公司也充分了解傳統(tǒng) Win32 對自家老用戶的重要性。
    的頭像 發(fā)表于 02-12 14:17 ?2055次閱讀

    Facebook宣布UWP客戶端徹底停用

    兩周前,F(xiàn)acebook 就已經(jīng)宣布了將從 Windows 10 應(yīng)用商店撤下 UWP 客戶端的消息。隨著這的正式到來,我們已無法再通過 Microsoft Store 下載該應(yīng)用。
    的頭像 發(fā)表于 02-29 15:37 ?1691次閱讀

    微軟Windows 10X系統(tǒng)支持UWP應(yīng)用和Win32應(yīng)用程序運行

    微軟確認Windows 10X系統(tǒng)能夠運行UWP應(yīng)用、網(wǎng)頁應(yīng)用以及傳統(tǒng)的Win32應(yīng)用程序。Win32、UWP和PWA應(yīng)用程序都會通過Windows
    的頭像 發(fā)表于 05-15 17:04 ?2288次閱讀

    Windows 10中,UWP應(yīng)用程序還有前途嗎?

    早在Windows 8發(fā)布時,微軟就承諾要在現(xiàn)代和傳統(tǒng)計算之間架起橋梁。在傳統(tǒng)的Win32應(yīng)用程序之外,Windows 8還為觸屏設(shè)備提供了現(xiàn)代應(yīng)用程序,也就是微軟所說的UWP應(yīng)用程序。
    的頭像 發(fā)表于 09-10 10:12 ?2940次閱讀

    微軟公布Project Reunion 預(yù)覽版 v0.1.0,統(tǒng) Win32 和 UWP API

    外媒 MSPoweruser 報道,在 Build 2020 大會上,微軟宣布了新項目 Project Reunion,讓 Windows 10 平臺的應(yīng)用開發(fā)變得更容易。Proj
    的頭像 發(fā)表于 12-14 09:37 ?1482次閱讀

    Windows 10、macOS 系統(tǒng)的全新電子郵件客戶端:基于網(wǎng)頁端Outlook

    微軟此前曾表示正制作適用于 Windows 10 和 macOS 系統(tǒng)的全新電子郵件客戶端,而根據(jù)最新掌握的信息該客戶端將會基于網(wǎng)頁端 Outlook 優(yōu)化而來。此外微軟還計劃淘汰 2015 年推出
    的頭像 發(fā)表于 01-08 12:55 ?2600次閱讀

    外媒:微軟計劃成立新的團隊,改進現(xiàn)有的Windows 10 內(nèi)置應(yīng)用

    2月2日消息 外媒 Windows Latest 報道,根據(jù)則新的招聘信息,微軟似乎正在為 Windows 10 規(guī)劃些新的功能和應(yīng)用體
    的頭像 發(fā)表于 02-03 11:26 ?1327次閱讀

    基于Raspberry Pi和通用Windows平臺(UWP)的無人機

    電子發(fā)燒友網(wǎng)站提供《基于Raspberry Pi和通用Windows平臺(UWP)的無人機.zip》資料免費下載
    發(fā)表于 07-03 14:49 ?0次下載
    基于Raspberry Pi和通用<b class='flag-5'>Windows</b>平臺(<b class='flag-5'>UWP</b>)的無人機
    主站蜘蛛池模板: www精品一区二区三区四区| 日本亚洲精品无码区国产电影 | 久久精品电影| 一品探花论坛| 快播电影网址| 把手戳进美女尿口里动态图| 日本学生VIDEOVIDEOS更新| 久久99精品AV99果冻传媒| 中文字幕人成乱码熟女APP| 暖暖日本免费播放| 性欧美videofree中文字幕| 好吊射视频988gaocom| 在教室伦流澡到高潮H免费视频 | 国产精品高清在线观看地址| 亚洲国产在线99视频| 蜜桃传媒视频| 国产成人在线视频播放| 一个人日本的视频免费完整版 | 天天干夜夜曰| 九九99热久久精品在线6| 国产成人无码区免费内射一片色欲 | 中文字幕成人免费高清在线| 色偷偷影院| 久草热在线| 韩国女主播内部vip自带氏巾 | 乱码午夜-极品国产内射| 国产XXXXXX农村野外| 扒开胸罩揉她的乳尖视频| 中文字幕亚洲视频| 熟女理发厅| 恋夜直播午夜秀场最新| 精品国产乱码久久久久久口爆| FREESEXVIDEO 性老少配| 亚洲国产成人在线| 欧美一区二区高清| 久爱在线中文在观看| 国产在线观看免费观看| av视频在线免播放观看| 亚洲精品青青草原avav久久qv| 情欲.美女高潮| 久久一er精这里有精品|