рд╣рдм рдкрд░ рд╕рдмрд╕реЗ рдкрд╕рдВрджреАрджрд╛ рд╣рдм рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрд░реЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ DIY рд░рд╣рд╛ рд╣реИ, рдореИрдВ рдЦреБрдж рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдХреБрдЫ рдХрд░рдиреЗ рдХрд╛ рдорди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдЬрдм рд╕реЗ рдореИрдВ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдзрд┐рдХ рд╣реВрдВ, рдФрд░ рдПрдХ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХреНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рд╣рдж рддрдХ, рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП "рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк" рд╣рдореЗрд╢рд╛ рдЕрдкреНрд░рдорд╛рдгрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИред рдХреЛрдб рднреА рдХрдВрдШреА рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╕рдорд╛рдзрд╛рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкреНрд░рдорд╛рдг-рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИред рдлрд┐рд░ рднреА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдкреЛрд╕реНрдЯ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡реЗ рднреА рд╣реИрдВ рдЬреЛ рдЗрд╕ рд╢рд┐рд▓реНрдк рдХреЛ рджреЛрд╣рд░рд╛рдПрдВрдЧреЗред
рддреАрд░ рд╡реВ-рдореАрдЯрд░ рдкрд░ рдПрдХ рдкреЛрд╕реНрдЯ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд, рд╕реАрдкреАрдпреВ рд▓реЛрдб рдФрд░ рд░реИрдо рдЙрдкрдпреЛрдЧ рджрд┐рдЦрд╛рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд▓рдШреБ рд╡рд╛рд▓реНрдЯрдореАрдЯрд░ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рднреА рдЗрд╕рдХреА рдХреАрдордд рдФрд░ 16x2 рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рд╕рд╛рджрдЧреА рдкрд░ рд╡рд┐рдЬрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реБрдП,
HD44780 рдХрдВрдЯреНрд░реЛрд▓рд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╕реНрдХреНрд░реАрди рдиреЗ рдЗрд╕ рдкрд░ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдПрдордХреЗ рдХреЗ рд░реВрдк рдореЗрдВ, MSP430G2
рд▓рдВрдЪрдкреИрдб рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдореИрдВрдиреЗ
рдЭреЗрдиреНрдпрд╛ рдХреЛ $ 4.30 рдореЗрдВ рдЦрд░реАрджрд╛ рдерд╛ред рдХреБрдЫ рднреА рдХрд┐рд╕реА рднреА arduino рдкрд░ рдпрд╣ рд╕рдм рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдмрд╕ рдкрд┐рдиреЛрдВ рдХреЗ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдпреЛрдЬрдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ (рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЗ рд▓реА рдЧрдИ рд╣реИ):

рдЖрдк рдмреИрдХрд▓рд╛рдЗрдЯ рдХреЛ рднреА рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрдВрдЯреНрд░рд╛рд╕реНрдЯ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢реБрд░реБрдЖрддреА рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ (рдореИрдВ рдЦреБрдж рд╕реЗ рдиреНрдпрд╛рдп рдХрд░рддрд╛ рд╣реВрдВ) рдХреЗ рд▓рд┐рдП рднреА рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рднрд╛рдЧ рдореЗрдВ рджреЛ рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ, рдкрд╣рд▓рд╛ Energia / Arduino рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдХреЗрдЪ рд╣реИред рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИред
рд╕реНрдХреЗрдЪ#include <LiquidCrystal.h> byte cpuByte; byte ramByte; unsigned long lastUpdateTime; unsigned long disconntime; int difer = 0; LiquidCrystal lcd(P2_3, P2_4, P1_5, P2_0, P2_1, P2_2); void setup() { Serial.begin(9600); lcd.begin(16, 2); lcd.clear(); lcd.print("FPanel V1.2"); } void loop() { if (Serial.available() == 2) { cpuByte = Serial.read(); ramByte = Serial.read(); lcd.setCursor(0, 0); lcd.print("CPU "); lcd.setCursor(4, 0); for (int i=0; i < cpuByte; i++) { lcd.write(255);} for (int i=cpuByte; i < 16; i++) { lcd.write(32);} lcd.setCursor(0, 1); lcd.print("RAM "); lcd.setCursor(4, 1); for (int i=0; i < ramByte; i++) { lcd.write(255);} for (int i=ramByte; i < 16; i++) { lcd.write(32);} lastUpdateTime = millis(); } if (millis()-lastUpdateTime > 3000) { lcd.setCursor(0, 0); lcd.print(" CONNECTING "); lcd.setCursor(0, 1); difer = (millis()-disconntime-3000) / 250; if (difer > 16) {disconntime = millis()-3000;} for (int i=0; i < difer; i++) {lcd.write(255);} for (int i=difer; i < 16; i++) {lcd.write(32);} delay(10); } delay(50); }
рддрд░реНрдХ рд╕рд░рд▓ рд╣реИ, рд╣рдо рджреЛ рдмрд╛рдЗрдЯреНрд╕ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдб 255 рдХреЗ рд╕рд╛рде рд╡рд░реНрдгреЛрдВ рдХреЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдирдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рде рдкрд┐рдЫрд▓реЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдорд┐рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ lcd.clear () рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдЪрдордХрддрд╛ рд╣реИред рдпрджрд┐ 3 рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рдбреЗрдЯрд╛ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ - рдЕрд╕реНрд╡реАрдХреГрддред
рдореИрдВ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ 1Cx рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рддрд╣рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рд╕рдВрдХрд▓рд┐рдд PLs, рдбреЗрд▓реНрдлреА / рдкрд╛рд╕реНрдХрд▓ рдореЗрд░реЗ рд╕рдмрд╕реЗ рдХрд░реАрдм рд╣реИред рдПрдХреНрд╕рдИ 2 рдХреЗ рдбреЗрд▓реНрдлреА рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдФрд░ рдореИрдВрдиреЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рджреВрд╕рд░рд╛ рднрд╛рдЧ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЪреВрдВрдХрд┐ рд╡рд┐рдВрдбреЛрдЬ рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рд╕рд░реНрд╡рд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЗрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдпреЛрдЬрдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЛ рдПрдХ рд╕реЗрд╡рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдбреЗрд▓реНрдлреА рдкрд░ рд╕реНрд░реЛрдд unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.SvcMgr, Vcl.Dialogs, Registry; type TFPService = class(TService) procedure ServiceExecute(Sender: TService); procedure ServiceCreate(Sender: TObject); private public function GetServiceController: TServiceController; override; end; var FPService: TFPService; const SystemBasicInformation = 0; SystemPerformanceInformation = 2; SystemTimeInformation = 3; type TPDWord = ^DWORD; TSystem_Basic_Information = packed record dwUnknown1: DWORD; uKeMaximumIncrement: ULONG; uPageSize: ULONG; uMmNumberOfPhysicalPages: ULONG; uMmLowestPhysicalPage: ULONG; uMmHighestPhysicalPage: ULONG; uAllocationGranularity: ULONG; pLowestUserAddress: Pointer; pMmHighestUserAddress: Pointer; uKeActiveProcessors: ULONG; bKeNumberProcessors: byte; bUnknown2: byte; wUnknown3: word; end; type TSystem_Time_Information = packed record liKeBootTime: LARGE_INTEGER; liKeSystemTime: LARGE_INTEGER; liExpTimeZoneBias: LARGE_INTEGER; uCurrentTimeZoneId: ULONG; dwReserved: DWORD; end; type TSystem_Performance_Information = packed record liIdleTime: LARGE_INTEGER; dwSpare: array[0..750] of DWORD; end; var NtQuerySystemInformation: function(infoClass: DWORD; buffer: Pointer; bufSize: DWORD; returnSize: TPDword): DWORD; stdcall = nil; SysBaseInfo: TSystem_Basic_Information; SysPerfInfo: TSystem_Performance_Information; SysTimeInfo: TSystem_Time_Information; status: Longint; liOldIdleTime, liOldSystemTime: LARGE_INTEGER; dbSystemTime, dbIdleTime, dbIdleTimePercent: Double; hCom: THandle; DCB:TDCB; Errors, Bytes : Cardinal; TheStruct:TCOMSTAT; Timeouts: TCommTimeOuts; ComNum:string; implementation {$R *.DFM} procedure ServiceController(CtrlCode: DWord); stdcall; begin FPService.Controller(CtrlCode); end; function TFPService.GetServiceController: TServiceController; begin Result := ServiceController; end; Procedure getComNum; var Reg: TRegistry; begin Reg := TRegistry.Create(KEY_READ or KEY_WOW64_64KEY); try Reg.RootKey := HKEY_LOCAL_MACHINE; if Reg.OpenKey('\SOFTWARE\FPanel', false) then begin ComNum := Reg.ReadString('ComNum'); Reg.CloseKey; end; finally Reg.Free; end; end; Procedure InitCPUUsage; begin if @NtQuerySystemInformation = nil then NtQuerySystemInformation := GetProcAddress(GetModuleHandle('ntdll.dll'), 'NtQuerySystemInformation'); status := NtQuerySystemInformation(SystemBasicInformation, @SysBaseInfo, SizeOf(SysBaseInfo), nil); if status <> 0 then exit; end; function CPUUsed: integer; function Li2Double(x: LARGE_INTEGER): Double; begin Result := x.HighPart * 4.294967296E9 + x.LowPart end; begin result := 0; status := NtQuerySystemInformation(SystemTimeInformation, @SysTimeInfo, SizeOf(SysTimeInfo), nil); if status <> 0 then Exit; status := NtQuerySystemInformation(SystemPerformanceInformation, @SysPerfInfo, SizeOf(SysPerfInfo), nil); if status <> 0 then Exit; dbIdleTime := Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime); dbSystemTime := Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime); dbIdleTimePercent := dbIdleTime / dbSystemTime * 100; liOldIdleTime := SysPerfInfo.liIdleTime; liOldSystemTime := SysTimeInfo.liKeSystemTime; if (dbIdleTimePercent / SysBaseInfo.bKeNumberProcessors) < 0 then result := 0 else result := round(abs(100-(dbIdleTimePercent / SysBaseInfo.bKeNumberProcessors))); end; function RAMUsed: byte; var RamStats: TMemoryStatus; begin GlobalMemoryStatus(RamStats); result := ramStats.dwMemoryLoad; end; procedure con2com; var ComFN:string; begin CloseHandle(hCom); ComFN := '\\.\COM' + comNum; hCom := CreateFile(PWidechar(ComFN), GENERIC_WRITE or GENERIC_READ, 0, nil, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, 0); if hCom = INVALID_HANDLE_VALUE then Exit; SetupComm(hCom,100,100); GetCommState(hCom,DCB); with DCB do begin BaudRate:=9600; ByteSize:=8; Parity:=NoParity; StopBits:=OneStopBit; end; SetCommState(hCom,DCB); GetCommTimeouts(hCom,Timeouts); with TimeOuts do begin ReadIntervalTimeout := 1; ReadTotalTimeoutMultiplier := 0; ReadTotalTimeoutConstant := 1; WriteTotalTimeoutMultiplier := 2; WriteTotalTimeoutConstant := 2; end; SetCommTimeouts(hCom,Timeouts); end; procedure TFPService.ServiceExecute(Sender: TService); var NumberWritten:LongWord; twoBytes:array[0..1] of byte; begin while not Terminated do begin twoBytes[0] := round(CPUUsed / 8.33); twoBytes[1] := round(RAMUsed / 8.33); if WriteFile(hCom, twoBytes, 2, NumberWritten, nil) = False then con2com; Sleep(250); ServiceThread.ProcessRequests(False); end; end; procedure TFPService.ServiceCreate(Sender: TObject); begin initCPUUsage; getComNum; con2com; end; end.
рд╕реЗрд╡рд╛ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, FP_service.exe рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдХреЗ рд░реВрдк рдореЗрдВ / рд╕реНрдерд╛рдкрд┐рдд рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ COM рдкреЛрд░реНрдЯ рд╕рдВрдЦреНрдпрд╛ рдЬрд┐рд╕ рдкрд░ рд╣рдорд╛рд░реЗ рд▓рдВрдЪрдкреИрдб "рд╣реИрдВрдЧ" рдкрде HKEY_LOCAL_MACHINE \ SOFTWARE \ FPanel рдХреЗ рдорд╛рди рдХреЗ рд╕рд╛рде, рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ ComNum рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреБрдВрдЬреА рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдорд╛рди ComNum = "12" рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдмрд╕ рд╕реЗрд╡рд╛ рд╕реНрдиреИрдк-рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ FPService рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░реЗрдВред рдЕрдЧрд▓реА рдмрд╛рд░ рд╡рд╣ рдЦреБрдж рд╢реБрд░реВ рдХрд░реЗрдЧреАред рд╕реЗрд╡рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓рдВрдЪрдкреИрдб рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЬреБрдбрд╝ рдЬрд╛рддреА рд╣реИ, рдЕрдиреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рддреА рд╣реИред
рдХрд╛рдо рдХрд╛ рд╡реАрдбрд┐рдпреЛ:
рдкреБрд░рд╛рд▓реЗрдЦ рдбреЗрд▓реНрдлреА рдкрд░рд┐рдпреЛрдЬрдирд╛ + рддреИрдпрд╛рд░ .exeрдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
UPD: 5 рджрд┐рдиреЛрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдорд┐рд▓реАред
UPD: рд╕реНрдХреЗрдЪ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛, рд░реЗрдВрдбрд░рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛, рд╕рд╛рде рд╣реА рдХрдиреЗрдХреНрд╢рди рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдиреАрдореЗрд╢рди рднреА рдЬреЛрдбрд╝рд╛ред
UPD: рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрд░реНрдХрд╛рдЗрд╡ рдХрд╛ рд▓рд┐рдВрдХ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ред