2020年12月24日 星期四

[Arduino] GP2Y1010AU0F 灰塵感測器檢測PM2.5


網路找到的資料:




不錯的文章:

GP2Y1010AU0F 灰塵感測器檢測PM2.5
https://atceiling.blogspot.com/2019/10/arduino73-gp2y1010au0f-pm25.html

GP2Y1010AU0F 灰塵感測
https://sites.google.com/site/csjhmaker/e0/gp2y1010au0f-hui-chen-gan-ce

Windows工作排程



不錯的文章:

搭配Windows工作排程, 讓Python自動執行https://www.coderbridge.com/@JohnnyFoxChang/5ea14379cd974b78a69d41e87d10dcde

2020年12月16日 星期三

[C#]問題收集(DataGridView為主)

 

How to change title bar image in WPF Window?
https://stackoverflow.com/questions/5101895/how-to-change-title-bar-image-in-wpf-window

https://www.itread01.com/content/1520581221.html
WPF調用圖片路徑,或資源圖片

Adding Something to DataGridView
https://me1237guy.pixnet.net/blog/post/59183044-adding-something-to-datagridview

怎么去掉DataGridView中最后空白的一行
https://bbs.csdn.net/topics/360135339

How to: Bind data to the Windows Forms DataGridView control
https://docs.microsoft.com/en-us/dotnet/desktop/winforms/controls/how-to-bind-data-to-the-windows-forms-datagridview-control?view=netframeworkdesktop-4.8

Ways to Bind DataGridView in C# Windows Forms
https://www.c-sharpcorner.com/UploadFile/deveshomar/ways-to-bind-datagridview-in-window-forms-C-Sharp/

c# winform 關於DataGridView的一些操作(很全,絕對夠用)
https://www.itread01.com/content/1546688738.html

datagridview前面还有个小箭头,这个如何去掉呢? ==> dataGridView的RowHeadersVisible属性设为false
DataGridview 選取整列資料 ==> 把SelectionMode 屬性改成 FullRowSelect

選取某列  ==>dataGridView1.Rows[i].Selected=true;

DataGridview的總row數(垂直方向) =>DataGridView.RowCount
DataGridview的總column(水平方向) =>DataGridView1.ColumnCount

取值 =>dataGridView1.Rows[0].Cells[1].Value

程式執行按鈕 ==>Button.PerformClick

2020年12月15日 星期二

[C#]how to access form event in user control

 

不錯的文章

C# Development | 煩人的跨執行緒作業無效 : 如何跨執行緒控制 UI 元件
https://medium.com/delightlearner/c-development-%E7%85%A9%E4%BA%BA%E7%9A%84%E8%B7%A8%E5%9F%B7%E8%A1%8C%E7%B7%92%E4%BD%9C%E6%A5%AD%E7%84%A1%E6%95%88-%E5%A6%82%E4%BD%95%E8%B7%A8%E5%9F%B7%E8%A1%8C%E7%B7%92%E6%8E%A7%E5%88%B6-ui-%E5%85%83%E4%BB%B6-41c7b129f47a

C#.net winform : How to access form event in user control
https://www.c-sharpcorner.com/forums/c-sharpnet-winform-how-to-access-form-event-in-user-control

2020年12月6日 星期日

[C#]以sender 操作當前控件

 

學一下......

C# 从控件 sender 操作当前控件
https://blog.csdn.net/qwehong/article/details/108487939

2020年12月3日 星期四

[C#]GUI技巧-子視窗數據傳輸給主視窗


不錯的文章

C#从子窗体传输数据给主窗体--方法(一)委托https://blog.csdn.net/qwehong/article/details/102628472?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control

C#从子窗体传输数据给其它窗体--方法(二)观察者设计模式的简单应用https://blog.csdn.net/qwehong/article/details/106873552

2020年12月2日 星期三

8051 使用keil的除錯模式檢視程式碼執行時間

了解一下:

使用keil的除錯模式檢視程式碼執行時間
https://www.itread01.com/content/1549472974.html

2020年11月25日 星期三

[stm32] PWM study

study 中... 

不錯的文章

Stm32f103 Pwm(Pulse width modulation) signal generation using internal timers, keil MDK-ARMv6 and Stmcubemx Ide
https://www.engineersgarage.com/stm32/stm32-pwm-generation-using-timers/

2020年11月19日 星期四

[stm32] ADC study


不錯的文章

Getting Started with STM32 - Working with ADC and DMAhttps://www.digikey.com/en/maker/projects/getting-started-with-stm32-working-with-adc-and-dma/f5009db3a3ed4370acaf545a3370c30c

【STM32CubeMX】5,STM32之ADC
https://www.itread01.com/content/1550512627.html

[stm32] SPI study

 


不錯的文章

STM32—cubeMX+HAL庫的SPI介面使用
https://www.itread01.com/content/1548978304.html

Getting Started with STM32 - How to Use SPI
https://www.digikey.com/en/maker/projects/getting-started-with-stm32-how-to-use-spi/09eab3dfe74c4d0391aaaa99b0a8ee17

2020年11月18日 星期三

[stm32] Timer study

timer1 polling:

HAL_TIM_Base_Start(&htim1);
uint16_t t1=__HAL_TIM_GET_COUNTER(&htim1);
HAL_Delay(100);
uint16_t t2=__HAL_TIM_GET_COUNTER(&htim1);
uint16_t diff=t2-t1;


timer1 isr:

HAL_TIM_Base_Start_IT(&htim1); => enable 方式不同

寫在main內的 timer callback functionvoid
 HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
// Check which version of the timer triggered this callback and toggle LED
if (htim == &htim1 )
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
}
}



不錯的文章:

Getting Started with STM32 - Timers and Timer Interrupts
https://www.digikey.com/en/maker/projects/getting-started-with-stm32-timers-and-timer-interrupts/d08e6493cefa486fb1e79c43c0b08cc6

[stm32] I2C study

 試著了解一下 I2C DMA.......

最後才知要呼叫 

HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA ( I2C_HandleTypeDef * hi2c,
uint16_t DevAddress,
uint16_t MemAddress,
uint16_t MemAddSize,
uint8_t * pData,
uint16_t Size
)

在實作中,有發現如果是HAL_BUSY 好像I2C就當掉了,無法復原:
STM32: Busy flag is set after I2C initialization

https://electronics.stackexchange.com/questions/272427/stm32-busy-flag-is-set-after-i2c-initialization


不錯的文章:
STM32CubeIDE HAL库操作IIC (一)配置篇
https://blog.csdn.net/u010779035/article/details/104346201

STM32F439xx HAL User Manual
http://www.disca.upv.es/aperles/arm_cortex_m3/llibre/st/STM32F439xx_User_Manual/group__i2c__exported__functions__group2.html#gab25b99552182d2486d8eb441fffdd0a4

STM32 I2C Tutorial – HAL Code Examples Slave & Master – DMA Interrupt
https://deepbluembedded.com/stm32-i2c-tutorial-hal-examples-slave-dma/

2020年11月11日 星期三

[stm32] I2C study

 

一開始 clock  sources要選對,之前選 Bypass 好像有問題

在MX_I2C1_Init(0 --> HAL_I2C_Init(&hi2c1) 內會有問題

 
一直回  HAL_ERROR,選了 clock sources 就 OK了,也知是否就這樣!!!

試了如下自寫function,好像有讀到資料


成功 !!!



2020年11月8日 星期日

[C#]在偵錯模式中為 console 程式帶參數

 選取menu的 Project項目內的Properties



選擇左邊Debug項目,填入引數參數


大功告成 !!😀😀






2020年10月26日 星期一

[C#]SHA加密練習

 照著書本key,練習一下

using System;

using System.IO;

using System.Security.Cryptography;

using System.Text;

using System.Threading;

using System.Threading.Tasks;


namespace ConsoleApp1

{

    class Program

    {

        static void Main(string[] args)

        { 

            using(FileStream fsin=File.Create("ver1.smp"))

            {

                byte[] buffer = new byte[256];

                Random rand = new Random();

                for(int x=0;x<150;x++)

                {

                    rand.NextBytes(buffer);

                    fsin.Write(buffer);

                }

            }

            File.Copy("ver1.smp", "ver2.smp", true);

            string curdir = Directory.GetCurrentDirectory();

            string[] files = Directory.GetFiles(curdir, "*.smp");

            SHA1 sha = SHA1.Create();

            foreach(string f in files)

            {

                using(FileStream fs=File.OpenRead(f))

                {

                    byte[] result = sha.ComputeHash(fs);

                    Console.WriteLine("file {0} Hash:", Path.GetFileName(f));

                    

                    StringBuilder bd = new StringBuilder();

                    foreach(byte b in result)

                    {

                        bd.AppendFormat("{0:X2} ", b);

                    }

                    Console.Write(bd + "\n\n");

                }

            }

            sha.Dispose();

        }

    }

}

2020年10月25日 星期日

[python]學習FFT

 照著網路文章打:

import numpy as np

import pylab as pl

sampling_rate=8000

fft_size=512

t=np.arange(0,1,1.0/sampling_rate)

x=np.sin(2*np.pi*156.25*t)+2*np.sin(2*np.pi*234.375*t)

xs=x[:fft_size]

xf=np.fft.rfft(xs)/fft_size

freqs=np.linspace(0,sampling_rate/2,fft_size/2+1)

xfp=20*np.log10(np.clip(np.abs(xf),1e-20,1e1000))


pl.figure(figsize=(8,4))

pl.subplot(211)

pl.plot(t[:fft_size],xs)

pl.xlabel(u"time(sec)")

pl.title(u"The Wave and Spectrum 156.25Hz 234.375Hz")

pl.subplot(212)

pl.plot(freqs,xfp)

pl.xlabel(u"Hz")

pl.subplots_adjust(hspace=0.4)

pl.show()



不錯的文章:

基於Python的數位訊號處理初步
https://kknews.cc/zh-tw/code/meppkp2.html

理解頻域、時域、FFT和加窗 加深對信號的認識
https://kknews.cc/news/q5b83a8.html



2020年10月22日 星期四

[C#]簡單 Pipe 傳輸

 照著課本練習


using System;

using System.IO;

using System.IO.Pipes;


namespace pipe_1

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("Hello World! pipe 1");

            using (NamedPipeServerStream server=new NamedPipeServerStream("demo"))

            {

                server.WaitForConnection();

                try

                {

                    using(StreamReader reader=new StreamReader(server))

                    {

                        string msg = null;

                        while((msg=reader.ReadLine())!=null)

                        {

                            Console.WriteLine($"client:{msg}");

                        }

                    }

                }

                catch

                {

                    Console.WriteLine("error");

                }

             //   Console.WriteLine(" wait exit");

             //   Console.Read();

            }

        }

    }

}

using System;
using System.IO;
using System.IO.Pipes;

namespace pipe_2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World! pipe 2");

             using(NamedPipeClientStream client=new NamedPipeClientStream("demo"))
            {
                client.Connect();

                using(StreamWriter writer=new StreamWriter(client))
                {
                    writer.AutoFlush = true;
                    
                    while(true)
                    {
                        Console.WriteLine("transmiter:");
                        string msg = Console.ReadLine();
                        if(!String.IsNullOrWhiteSpace(msg))
                        {
                            writer.WriteLine(msg);
                        }
                    }
                }
            }
        }
    }
}




2020年10月21日 星期三

[C#]memory mapped to file

照著課本練習key in

using System;

using System.IO;

using System.IO.Compression;

using System.IO.MemoryMappedFiles;

using System.Net.Http.Headers;

using System.Numerics;


namespace ConsoleApp1

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("Hello World!");


            MemoryMappedFile file = MemoryMappedFile.CreateNew("test", 200L);


            using(var mvstream=file.CreateViewStream())

            {

                using(StreamWriter writer=new StreamWriter(mvstream))

                {

                    writer.WriteLine("hello 1st");

                    writer.WriteLine("hello 2th");

                }

            }


            using(MemoryMappedFile mfile=MemoryMappedFile.OpenExisting("test"))

            {

                using (var vstream=mfile.CreateViewStream())

                {

                    using (StreamReader resder = new StreamReader(vstream))

                    {

                        string str = resder.ReadToEnd();

                        Console.WriteLine(str);

                    }

                }

                

            }


            using (MemoryMappedFile mmfile = MemoryMappedFile.CreateFromFile("map.data", FileMode.OpenOrCreate, "udemo", 100L))

            {

                using (var vstream = mmfile.CreateViewStream())

                {

                    using (BinaryWriter writer = new BinaryWriter(vstream))

                    {

                        writer.Write(150);

                        writer.Write(1.17f);

                        writer.Write(96000L);

                        writer.Write(13.965d);

                    }

                }

            }


            using(FileStream stream=File.OpenRead("map.data"))

            {

                Console.WriteLine($"file size:{stream.Length}");

                using(BinaryReader reader=new BinaryReader(stream))

                {

                    int v1 = reader.ReadInt32();

                    float v2 = reader.ReadSingle();

                    long v3 = reader.ReadInt64();

                    double v4 = reader.ReadDouble();

                    Console.WriteLine($"AAA:{v1}  {v2}  {v3}  {v4}");

                }

            }

        }

    }


}


[C#] Zip 壓縮/解壓縮檔案

 照著課本,練習Key:

using System;

using System.IO;

using System.IO.Compression;

using System.Net.Http.Headers;

using System.Numerics;


namespace ConsoleApp1

{

    class Program

    {


        static void Main(string[] args)

        {

            Console.WriteLine("Hello World!");


            //DeflateStream


            using(FileStream instream=new FileStream("doc1.txt",FileMode.Open))

            using(FileStream outstream=new FileStream("out.def",FileMode.Create))

            using (DeflateStream defstream=new DeflateStream(outstream,CompressionLevel.Optimal))

            {

                instream.CopyTo(defstream);

            }

            FileInfo info1 = new FileInfo("doc1.txt");

            FileInfo info2 = new FileInfo("out.def");

            Console.WriteLine($"Before Compress:{info1.Length}");

            Console.WriteLine($"After Comoress:{info2.Length}");




            //zip


            string zipFile = "demo.zip";

            using (FileStream outfs =File.Create(zipFile))

            {

                using (ZipArchive zip = new ZipArchive(outfs, ZipArchiveMode.Create))

                {

                    ZipArchiveEntry etl = zip.CreateEntry("doc1.txt");

                    using (Stream stream = etl.Open())

                    {

                        using (StreamWriter writer = new StreamWriter(stream))

                        {

                            writer.Write("範例文件 A");

                        }

                    }


                    ZipArchiveEntry et2 = zip.CreateEntry("doc2.txt");

                    using (Stream stream=et2.Open())

                    {

                        using(StreamWriter writer =new StreamWriter(stream))

                        {

                            writer.Write("範例文件 B");

                        }

                    }    

                }

            }


            using (FileStream instream = File.OpenRead(zipFile))

            {

                using(ZipArchive zip=new ZipArchive(instream))

                {

                    foreach(ZipArchiveEntry et in zip.Entries)

                    {

                        using(Stream stream=et.Open())

                        {

                            using(FileStream fsout=File.Create(et.Name))

                            {

                                stream.CopyTo(fsout);

                            }

                        }

                    }

                }

            }


            //GZipStream

            string outFileName = "demo.gz";

            using (FileStream fsIn = File.OpenRead("doc1.txt")) 

            using (FileStream fsOut = File.Create(outFileName)) 

            using (GZipStream gz = new GZipStream(fsOut, CompressionMode.Compress))

            {

                fsIn.CopyTo(gz);

            }


            FileInfo info3 = new FileInfo("doc1.txt");

            FileInfo info4 = new FileInfo(outFileName);

            Console.WriteLine($"Before Compress:{info3.Length}");

            Console.WriteLine($"After Comoress:{info4.Length}");


        }

    }


}


2020年5月13日 星期三

[C#] WPF UI 設計

不知是蛇東西看起來不錯


PanuonUI.Silver中文手册
https://github.com/Panuon/Panuon.Documents/blob/master/Documents/PanuonUI.Silver/zh-cn.md#step-1-%E5%B0%86panuonuisilver%E5%BC%95%E5%85%A5%E5%88%B0%E4%BD%A0%E7%9A%84%E9%A1%B9%E7%9B%AE%E4%B8%AD

开源C# WPF控件库《Panuon.UI.Silver》
https://dotnet9.com/2285.html#p200

不太會用,下面感覺比較好用.......

WPF MaterialDesign 開源免費UI組件的介紹和簡單使用https://www.twblogs.net/a/5d5f3e96bd9eee5327fdf47f

C# WPF抽屉效果实现(C# WPF Material Design UI: Navigation Drawer & PopUp Menu)https://blog.csdn.net/HenryMoore/article/details/103603291


學習中...
WPF MaterialDesignInXaml PopupBox更改圖標
http://hk.uwenku.com/question/p-gwznqvwi-dh.html

2020年1月16日 星期四

[raspberry]開機自動執行程式

來試試,學習學習......



樹莓派程序開機自啓動方法總結
https://www.twblogs.net/a/5b8078342b71772165a7c9d8

Run a Program On Your Raspberry Pi At Startup
https://www.dexterindustries.com/howto/run-a-program-on-your-raspberry-pi-at-startup/


Debian/Ubuntu 的 update-rc.d 使用教學https://blog.wu-boy.com/2017/04/update-rc-in-debian-or-ubuntu/

update-rc.d和invoke-rc.d
http://ruby-notebook.blogspot.com/2015/03/update-rcdinvoke-rcd.html