読者です 読者をやめる 読者になる 読者になる

プログラミング素人のArduino

技術屋の末端。プログラミングは専門外。 電気回路も専門外です。 コードに間違いなど見つけられたら、気軽にコメントください。 VC#始めました。

C#でTextファイルへの入出力

VC#

例としてHearth Loggerを作ります。
Form1は以下のようなものを作りました。

仕様としては、
・入力は日付、体重、体脂肪率
・プログラムを起動したら、日付は今日の日付を表示。ただし、手入力で変更可能
・OKを押下でファイルに記録。
・OKを押したときグラフCheckboxがONならグラフを表示

f:id:s51517765:20170329203915j:plain


まず、ファイル入出力を扱うので、以下を追加します。

using System.IO;

OKボタンを押下したときに、日付、体重、体脂肪を「カンマ」区切りでtxtもしくはcsvに取り込みます。
日付は後述で自動的に今日の日付を入れるようにしてありますが、体重と体脂肪が空欄の時は追記をスキップします。
チェックボックスがCheckedのときは、グラフを表示します。
グラフの表示にCheckboxの判断を掛け合わせていますが、グラフのインスタンス生成のところはよくわかってないので適切かどうか…。

 private void button1_Click(object sender, EventArgs e)
        {
            double weight;
            double fat;
            if (double.TryParse(textBoxWeight.Text, out weight) == true &&
                double.TryParse(textBoxFat.Text, out fat)==true)
            {
                using (StreamWriter writer = new StreamWriter("data.txt", true)) 
                      //書き込む先のファイル名は"data.text"
                {
                    writer.Write(textboxDate.Text); //textboxの内容を書き込む
                    writer.Write(",");          //任意(ここではカンマ)のTextを書き込む。
                    writer.Write(textBoxWeight.Text);
                    writer.Write(",");
                    writer.WriteLine(textBoxFat.Text);
                    writer.Flush();
                    textBoxWeight.Text = "";  //入力欄であるtextboxをクリア
                    textBoxFat.Text = "";
                }
            }

            Graph Form2 = new Graph();   //グラフのインスタンス生成
            if (checkBoxGraph.Checked == true)  //Checkbox判断
            {
                if (Form2.ShowDialog() == DialogResult.OK) //OKボタンが押されたら
                {

                }
            }

            Form2.Dispose();

        }

日付は今日の日付を取得し、年月日の形式で表示します。

     private void Form1_Load(object sender, EventArgs e)
        {   //Form1が開いたときの動作
            DateTime dt = DateTime.Now; //dtに今日の日付(と現在時刻)
            textboxDate.Text = dt.ToString("yyyy-MM-dd");  //textboxに文字列として"dt"をyyyy-mm-ddの日付形式で
        }

ここまでが、Form1。

ここからForm2。
Form2が読み込まれたときの動作。
始めにまとめて変数を定義しています。
Tryの中でファイルを開いて、日付、体重、体脂肪率にわけて配列に読み込むようにしています。
ここで、Tryは処理に例外が発生した場合、CatchにすすみErrorを出します。
Try,Catchの構文で、予期せぬErrorで止まってしまうのを防ぎます。

   private void Form2_Load(object sender, EventArgs e)
        {
            int n = 1;
            int no = 0;
            int Data_Count=4;
            int Array_Length = 400;
            string[] date = new string[Array_Length];
            string[] Weight_text= new string[Array_Length];
            double[] Weight = new double[Array_Length];
            string[] Fat_text=new string[Array_Length];
            double[] Fat = new double[Array_Length];
            DateTime[] date_style = new DateTime[Array_Length];

try
            { //csvファイルを開いて、日付、体重、体脂肪率にわけて配列に読み込む

                string[] StrArryData = new string[3]; // 1行分のデータを格納する
                using (var sr = new System.IO.StreamReader(@"data.txt")) //読み込むファイル名
                {

                    while (!sr.EndOfStream) //ファイルエンドまで
                    {
                        var line = sr.ReadLine();    // ファイルから一行読み込む
                        StrArryData = line.Split(','); //一行を区切る

                        foreach (string value in StrArryData) //strArrayDatsをStringとして、そのすべてに対して
                        {

           //Data3つごとに分けて配列に格納
                            if (n % 3 == 1)
                            {
                                date[no] = value;
                                DateTime.TryParse(date[no], out date_style[no]); //textをDateTime型に
                            }
                            else if (n % 3 == 2)
                            {
                                Weight_text[no] = value;
                                double.TryParse(Weight_text[no], out Weight[no]); //Textを数値に型変換
                            }
                            else if (n % 3 == 0)
                            {
                                Fat_text[no] = value;
                                double.TryParse(Fat_text[no], out Fat[no]);
                                no++;
                            }
                            n++;
                        }
                        Data_Count = no;
                    }
                }
            }
           catch (System.Exception ee)
            {
                MessageBox.Show("Error");
                // ファイルを開くのに失敗したとき
            }

次に、グラフの表示内容

           // 1.Seriesの追加
            Chart1.Series.Clear();
            Chart1.Series.Add("Weight (kg)");
            Chart1.Series.Add("Body fat (%)");
            

            // 2.グラフのタイプの設定
              Chart1.Series["Weight (kg)"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
              Chart1.Series["Weight (kg)"].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Diamond;
              Chart1.Series["Body fat (%)"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
              Chart1.Series["Body fat (%)"].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Diamond;
          
            // 3.座標の入力
            for (no = 0; no < Data_Count; no++)
            {
                Chart1.Series["Weight (kg)"].Points.AddXY(date_style[no],Weight[no]);
                    Chart1.Series["Body fat (%)"].Points.AddXY(date_style[no], Fat[no]);
               }

グラフはこのページを参考にした…というより丸写しに近い。
whoopsidaisies.hatenablog.com

f:id:s51517765:20170329220510j:plain

Visual Studioで間違ってClickイベントができてしまったら

VC#

Visual StudioC#コーディング中、よく起きるのが、まちがってフォームクリックイベントを作ってしまうこと。

private void Label1_Click(object sender, EventArgs e)
{

}

これをだからといって、Codeから消そうとすると、DesignerがErrorを出す。
f:id:s51517765:20170323230004j:plain

正しい解法は↓

1.デザイン画面で、イベントハンドラを消したいコントロールを選択。
2.プロパティウインドウのイベント一覧ボタン(雷マーク)をクリック。
3.消したいイベント名(一覧左側のClickとか)を右クリック。
4.「リセット」を選択。

detail.chiebukuro.yahoo.co.jp

Visual Studioでフォームデザインが表示されないと思ったら

VC#

Visual StudioでVC#プログラミングをしているとき、何かの拍子にForm1.cs[デザイン]のタブがいなくなった。

f:id:s51517765:20170224213628j:plain

このように、Form1.csに対して、

f:id:s51517765:20170224213632j:plain
のようなもののことだが。

通常、プロジェクトファイルは、VS上で ファイル¥開く¥プロジェクト/ソリューションと 選択するか、
f:id:s51517765:20170224213859j:plain

直接エクスプローラから選択すると、通常は開発画面が復旧する。

しかし、Form1.cs[デザイン]がいなくなってしまった状態では、いない状態しか現れない。
エクスプローラからForm.csやForm1.Designer.csは開けるが、Form1.cs[デザイン]はない。
f:id:s51517765:20170224213905j:plain
かといって、プロジェクトが壊れてしまったとか、関連付けがなくなってしまったわけではないようで、Debug/Release機能を使えば正常にアプリが動作しているのである。

ぐぐるが似たようなキーワードの現象は見つかるものの、ちょっと違うようなのである。

www.google.co.jp

試行錯誤の結果、右側のソリューションエクスプローラから開くことができた。
Form1.cs をダブルクリック。
f:id:s51517765:20170224215342j:plain

うーん、やれやれ。

ちなみに↓は6章まで読み進めた。

ゴールからはじめるC# ~「作りたいもの」でプログラミングのきほんがわかる

ゴールからはじめるC# ~「作りたいもの」でプログラミングのきほんがわかる

オブジェクト思考、クラス、インスタンスといったところが分かりにくいが、すべてはわからなくても何とかなる。

Visual Studio 2015によるWindowsアプリケーション作成

VC#

Visual Studio Community 2015によるWindowsアプリケーション作成を始めました。

もともとはC言語によるプログラミングをやっていましたが、コマンドプロンプトで動作するプログラムだけではなく、Windowsアプリを作ってみようと思いました。

そこで、Visual Studioをつかえばそういったことができるとわかりました。
しかし、Visual StudioC言語はできなくはないけど、すでに推奨環境ではないことがわかりました。

ようするに、Windowsアプリをこれから始めようとするなら、 Visual C#または Visual Basicのほうが良いということです。

Visual Studio Communityでも標準インストールではC/C++はインストールされません。

Visual C#C#の拡張でWindowsアプリなどを作ることができるものですが、C#C/C++Java? の拡張らしいです。

ちょっと調べてみると、C#はCの類推だけでもかなり理解できそうだとわかりました。
しかも、文法の許容範囲が広く、むしろ簡単のようです。
(文法の制限が緩いということは、意図しない動作を許容することになるので必ずしもいいことだけではありませんが)

そんな感じで作ってみたのが
f:id:s51517765:20170205112053j:plain

開発画面はこんな感じ。
f:id:s51517765:20170205112101j:plainf:id:s51517765:20170205112710j:plain
金利計算は簡易的です)

参考にしたのは↓

コマンドプロンプトで動作するコンソールアプリケーションと言われるものとVisual C#のもっとも違う点は、
Formでのボタンクリックや、テキストボックスからの情報の取得です。
それ以外はこれまでに学んできたCの基本がそのまま使えます。


ボタンクリックで動作する内容は、Form画面で設置した”ボタン”をダブルクリックすると、このようなコードが自動生成します。
この中にコードを記述します。

  private void button1_Click(object sender, EventArgs e)
        {
      }

テキストボックスへの出力はこのような形。

label3.Text = year + "年で達成できます。";

この本には各章ごとに練習問題があり、この本を購入するとそのコード全文も見ることができます。
ですから、自分ではわからないことはどのように記述すればいいかも答えを見ることができます。

たとえば、4章の章末問題はこのようなもの。
f:id:s51517765:20170205120039j:plain

ゆっくり勉強しても2週間ぐらいでこれぐらいまでできるようになりました。

ちなみにこの本はKindle版もあるようですが、これに限りませんが視認性は紙に限りますね。

抵抗の並列接続とは

電子工作

直流電源に対して、抵抗を接続するとき、所望の抵抗が無ければ(ラインナップに無かったり単純に手元に無かったりすれば)合成抵抗という手法を用いる。

 

たとえば、300Ωが必要なら100Ωと200Ωを直列にする。

このように使えることを前提にして抵抗値のラインナップは飛び飛びの値しか用意されていない。

 

ところで、抵抗接続接続にはもうひとつ並列接続というのがある。

 

直列接続では合成抵抗はそれぞれの抵抗値を足せばいいのに対して、並列接続では掛けたものを足したもので割る。

これがどういう意味か考えてみる。

 

たとえば電圧Vの電源にR1ΩとR2Ωの抵抗を並列に繋いでみると、それぞれの抵抗両端の電圧はVである。

またR1に流れる電流をiとすると、

V= R1*iでまた、R2に流れる電流をjとすると

V =R2*jである。

 

並列接続のとき電流は2つの抵抗を流れる電流の和なので、i+j = V/R1 + V/R2

 

電圧はVで電流は上記なので

抵抗RはV/(i+j)= 1/(1/R1 + 1/R2)

R= (R1*R2)/(R1+R2)

 

Win10にVisual Studio Communityをインストール

C/C++ VC#

Visual Studio Communityをインストールした。

Visual StudioWindowsで定番のIDEである。
高機能な反面、重いことでも有名。

www.atmarkit.co.jp

このへんを参考にインストールを進めようとしたが、記事のなかでは日本語になっているのにサイトは英語しかない。

www.visualstudio.com

どうやら、英語のみになったらしい。

日本語化パッチも同時に入手しておく。

qiita.com

インストールが始まって20分以上たったが、まだ継続中。
C++に限定すれば早かったのかな?
f:id:s51517765:20170106214140p:plain

できた。ここまで1時間半ぐらい。
初めて起動するときはMSアカウントを入力する必要がある。
Win10のsetupで使ったものだが、なければここで作成する必要がある。
f:id:s51517765:20170106223705p:plain

次に日本語化パッチを起動。
f:id:s51517765:20170106223716p:plain
こちらも20数分。

日本語化パッチのインストールがすんだらVCをまた起動して、メニューのTool¥Option¥Environment¥International Settingsから日本語を選択。
etclsc.hatenablog.jp

つぎにプロジェクトの作成にすすむ。
メニューのファイル¥新規作成¥プロジェクトからVisual C++を選び、2015 Tools for Desktopを選択しインストール

ここでまた、インストールに30分ぐらい。もっとかかったか?
f:id:s51517765:20170107124929p:plain
これで、こんどこそインストール完了。

チュートリアル: Win32 コンソール プログラムの作成 (C++)

[ファイル] メニューの [新規作成] をポイントして [プロジェクト] をクリックすることにより、プロジェクトを作成します。
[Visual C++] プロジェクトの種類ペインで、[Win32] をクリックし、次に [Win32 コンソール アプリケーション] をクリックします。
プロジェクトの名前を入力します。
既定では、プロジェクトを含むソリューションはプロジェクトと同じ名前になりますが、別の名前を入力してもかまいません。 プロジェクトの場所として別の場所を入力することもできます。
[OK] をクリックして、プロジェクトを作成します。
Win32 アプリケーション ウィザードで、[次へ] をクリックし、[空のプロジェクト] をクリックし、[完了] をクリックします。
ソリューション エクスプローラーが表示されない場合は、[表示] メニューの [ソリューション エクスプローラー] をクリックします。
次のように、プロジェクトに新しいソース ファイルを追加します。
ソリューション エクスプローラーで、[ソース ファイル] フォルダーを右クリックし、[追加] をポイントして、[新しい項目] をクリックします。
[コード] ノードの [C++ ファイル (.cpp)] をクリックし、ファイル名を入力して [追加] をクリックします。
ソリューション エクスプローラーの [ソース ファイル] フォルダーに .cpp ファイルが表示され、ファイルが Visual Studio エディターに開かれます。
エディターのファイルで、標準 C++ ライブラリを使用する有効な C++ プログラムを入力するか、サンプル プログラムをコピーしてファイルに貼り付けます。

f:id:s51517765:20170107125920p:plain

できた。

Win10にArduino IDEを導入

Arduino 電子工作

Win10 タブレットを入手した。

Asus Transbook T102HA


↓多分このへんだと思う。 (Link修正1/10)

似たような機種がいくつかあるようなので一応、手元のスペックを張り付けておく。
f:id:s51517765:20170110165700p:plain

これにarduino開発環境IDEを導入した。

特になにも考えることなく公式ページからWindowsIDEをdownloadし動作させることが出来た。

結果的に↓のページと同じことを行ったようで、これが再現したということになる。

http://blog.goo.ne.jp/pearlwing/e/3565bb55ba2a28d245bb32185a839055