🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

2回答

3423閲覧

Arduinoとロードセル、HX711を使用してリレーモジュールを動かしたい

yukikaze0623

総合スコア5

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2019/10/05 22:36

前提・実現したいこと

Arduinoとロードセル、HX711を使用して(例:重さが500g)を超えたらリレーモジュールを動かしたい

発生している問題・エラーメッセージ

ifの条件にどれを参考にしていいかわからない。

該当のソースコード

#include <Arduino.h> void AE_HX711_Init(void); void AE_HX711_Reset(void); long AE_HX711_Read(void); long AE_HX711_Averaging(long adc,char num); float AE_HX711_getGram(char num); //---------------------------------------------------// // ピンの設定 //---------------------------------------------------// #define pin_dout 8 #define pin_slk 9 //---------------------------------------------------// // ロードセル シングルポイント( ビーム型) SC133 20kG [P-12034] //---------------------------------------------------// #define OUT_VOL 0.00091f //定格出力 [V] #define LOAD 5000.0f //定格容量 [g] float offset=0; void setup() { pinMode(4,OUTPUT); Serial.begin(9600); Serial.println("AE_HX711 test"); AE_HX711_Init(); AE_HX711_Reset(); offset = AE_HX711_getGram(30); } void loop() { float data; char S1[20]; char s[20]; data = AE_HX711_getGram(5); sprintf(S1,"%s [g] (0x%4x)",dtostrf((data-offset), 5, 2, s),AE_HX711_Read()); Serial.println(S1); } void AE_HX711_Init(void) { pinMode(pin_slk, OUTPUT); pinMode(pin_dout, INPUT); } void AE_HX711_Reset(void) { digitalWrite(pin_slk,1); delayMicroseconds(100); digitalWrite(pin_slk,0); delayMicroseconds(100); } long AE_HX711_Read(void) { long data=0; while(digitalRead(pin_dout)!=0); delayMicroseconds(10); for(int i=0;i<24;i++) { digitalWrite(pin_slk,1); delayMicroseconds(5); digitalWrite(pin_slk,0); delayMicroseconds(5); data = (data<<1)|(digitalRead(pin_dout)); } //Serial.println(data,HEX); digitalWrite(pin_slk,1); delayMicroseconds(10); digitalWrite(pin_slk,0); delayMicroseconds(10); return data^0x800000; } long AE_HX711_Averaging(long adc,char num) { long sum = 0; for (int i = 0; i < num; i++) sum += AE_HX711_Read(); return sum / num; } float AE_HX711_getGram(char num) { #define HX711_R1 20000.0f #define HX711_R2 8200.0f #define HX711_VBG 1.25f #define HX711_AVDD 4.2987f//(HX711_VBG*((HX711_R1+HX711_R2)/HX711_R2)) #define HX711_ADC1bit HX711_AVDD/16777216 //16777216=(2^24) #define HX711_PGA 128 #define HX711_SCALE (OUT_VOL * HX711_AVDD / LOAD *HX711_PGA) float data; data = AE_HX711_Averaging(AE_HX711_Read(),num)*HX711_ADC1bit; //Serial.println( HX711_AVDD); //Serial.println( HX711_ADC1bit); //Serial.println( HX711_SCALE); //Serial.println( data); data = data / HX711_SCALE; if (digitalRead(pin_dout) >=500 ) { digitalWrite(4, HIGH); //リレーをON(HIGH } else { digitalWrite(4, LOW); //リレーをOFF(LOW } return data; }

試したこと

ifのコードを“data”“AE_HX711_Read”など試したがうまくいかない、デジタルだから2進数?と混乱中

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

試す、というのは思いつくなにかを入れて偶然の当たりを狙うことではありません。
もっと勉強して既存のプログラムが何をやっているかをちゃんと理解してから改造にかかるべきかと思います。
("teratailは技術に興味のある人達が集まって云々"というサイトですからそう考えてもいいですよね。他所だと「ゴタク並べてないで黙って答えだけ教えろ」なんていうところもあるので)

さて。
AE_HX711_getGram関数内をいじったところはもとに戻して

Arduino

1void loop() 2{ 3 float data; 4 char S1[20]; 5 char s[20]; 6 data = AE_HX711_getGram(5)-offset;//offsetは先に引いてしまう 7 sprintf(S1,"%s [g] (0x%4x)",dtostrf(data, 5, 2, s),AE_HX711_Read()); 8 Serial.println(S1); 9 10 digitalWrite(4, data>=500); //リレー制御 11}

でどうでしょう。実機があるわけではないので私には確認は出来ません。


AE_HX711_getGramという関数名には、作者の「この関数はデータをグラム単位の値で取得するんだよ」という想いがにじみ出ています。なら、その中でリレーをカチャカチャ動かすのはどうでしょう。「私の仕事は目盛を読んで次の人に伝えることです」と名札に書いてある人に「リレーの操作もやってね」というのは混乱しませんか。そこで操作するのは適切ではないでしょう。
で、その関数が返してくる値をdataという変数にとっているのですから、きっとそれがグラム単位のデータなのでしょう。なお、オフセット(無負荷時のずれ)の補正もしているようですから、その値は先に引いてしまいます。
そうすれば、その値と500を比べた結果を(C/C++では比較の演算子は0または1を返します。ArduinoはC++言語をベースにしています)リレーを制御するピンにそのまま出してやればとりあえず用は足りるのではないかと思われます。

実用に供するには、境界値付近の微妙な測定値の変動でリレーがカチャカチャしたりしないように「ヒステリシス」あるいは「時定数」を持たせたりとかのテクニックもありますけれど。

投稿2019/10/06 01:35

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukikaze0623

2019/10/06 07:13

ありがとうございます!! 意図した通りに動きました。アナログセンサーを使用してLチカは良く見かけるのですが、デジタルセンサーから指定値でLチカといった解説は見つからなかったので、すごく勉強になりました。また、ヒステリアス、時定数などのヒントも教えていただき大変助かりました。
guest

0

まずは、AE_HX711_Readの結果をプリントアウトさせるようにしましょう
そして、そのロードセルに何グラムを乗せればどういう数値が出るのかを調べていきます
500ぐらむでいくつ、400グラムでいくつ、600グラムでいくつ、というのを調べれば、その判断もできるようになるでしょう

投稿2019/10/05 22:59

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問