• 2

新手詢問ARDUINO的設定執行的優先順序

大家好~不好意思~我是ARDUINO新手,我一直有個問題搞不清楚,就是有關啟動或關閉某個設備的程式碼編寫。
大致上是這樣:

我希望我的遙控船

在水池水位到達一定的的水位高度後→→ 啟動馬達。
但是希望就算水位高度達啟動馬達的狀態,不過馬達偵測器偵測到馬達轉數高於3200轉/分後→→關閉馬達。


請問在ARDUINO上面該如何表示這樣的語法?


int waterlabel; //定義水位
waterlabel = analogRead(0); //水位是類比0的位置
if (waterlabel > 480) //如果水位大於480
{
digitalWrite(2, HIGH); // 開繼電器讓馬達轉
}

.....但是馬達高達3200轉,停掉馬達的程式.....我就不會寫了。


另外想請問一下,當水位在臨界時,RELAY會一直啟動關閉啟動關閉,似乎是因為水位在臨界時數值會上下跑,除了用delay(1000)等方法避免外,有沒有其他方式???

2016-03-31 17:52 發佈
我也算新手,你的問題我會考慮這樣做

if 水位>480 並且 馬達轉速<3200 ,啟動馬達

if 水位<450 或者 馬達轉速>3200 ,關閉馬達

要避免因為數值變動而開開關關,可以把開啟與關閉值設定為一個區間。
水位到達480才會啟動,降低到450才會關閉馬達。
這樣假設水位在490~470之間浮動時就不會開開關關。

馬達轉速雖然也可以這樣處理,但是僅用開跟關來控制,
會面臨馬達不斷加速(啟動)、減速(關閉)。
控制馬達需要控制電壓,直流馬達轉速跟電壓有關連,
使用PWM調壓控制才能穩住馬達的轉速。

這個部分可能要搭配其他電路,我就沒有玩這麼多了,
Arduino雖然也有PWM輸出功能,但是電流輸出有限,
吃電大的馬達就不適合了。
這真的有點深澳
a5899 wrote:
大家好~不好意思~...(恕刪)

k62000 wrote:
我也算新手,你的問...(恕刪)


可否稍微教導一下程式碼大約要怎麼寫勒?

也就是您所謂的兩個變數要寫在一起?

a5899 wrote:
...(恕刪)兩個變數要寫在一起?


and邏輯是&&

if (digitalRead(2) == HIGH && digitalRead(3) == HIGH)

or邏輯是||

if (x > 0 || y > 0)

我比較好奇的是,你要怎麼偵測馬達轉速?
馬達是買三線式的,亦即正負電源+訊號線。
因此就把訊號線接到PIN腳上就可以看到轉數的數值。

話說我還有一個問題,我有一個水位計,他只有兩條線,滿水位的時候是短路,低水位的時候斷路,請問是不是一邊接到一個PIN腳,另一邊連到5V或者3.3V那邊,然後指定該PIN腳為INPUT。
接著去設定

if watersensor== hight
去開啟某設備的電源
else
關閉某設備的電源

這樣對嗎?

謝謝


a5899 wrote:
是不是一邊接到一個PIN腳,另一邊連到5V或者3.3V那邊...(恕刪)


Arduino用的水位計我看到的都是三線,訊號線能提供水位讀數。
你那兩線的應該是普通的浮球開關之類的吧,就當做一般開關處理即可。

這樣接基本上會動,但是容易不穩定。
因為當Pin腳無輸入時,容易因為雜訊而誤判有時讀到High有時讀到Low。
需要搭配10kΩ上拉電阻(開關未接通為High)或下拉電阻(開關未接通為Low)。

另外一個作法是啟用Arduino內建的上拉電阻,用以下指令
(不可用Pin 13,要用Pin 13需用外接的電阻自行作上拉/下拉)
pinMode(pin, INPUT_PULLUP);
這樣只需要把開關一端接在設定的Pin,一端接在GND。
(當Pin== Low時(開關接通)滿水位,當Pin==High(開關斷開)時低水位)

另外還要處理開關彈跳訊號問題,只要是機械式開關都需要處理。
(金屬簧片接觸的彈跳,人無法察覺,但是電子元件的運作速度快會讀取到好幾次的on/off)
讀取Pin腳訊號後,Delay一段時間再讀取一次,狀態相同才執行。
想再詢問一下,我在void loop()中我想去設定溫度、濕度、土壤濕度、土壤電導度以及時間的擷取時間,目前我只有在所有程式的最後加上了delay(1000)去控制擷取時間,但是這樣會讓整個程式皆會以一秒的更新頻率去刷新SENSOR的數值,請問有無可以讓每種SENSOR皆有不同的更新頻率呢?
例如溫度是5秒一次、濕度是10秒一次、土壤濕度是30秒一次、土壤導電度是一天一次、時間就讓他1秒更新一次.....
a5899 wrote:
想再詢問一下,我在void...(恕刪)


可以定義幾個變數,有幾個SENSOR就定義幾個變數,

1.每秒各個變數 +1(秒計數),

2.判斷各個變數是不是= SENSOR更新的秒數,是就更新並且該SENSOR的變數歸零

3.下一個SENSOR變數判斷.


例如:

int SensorTcnt1 = 0; //Sensor 1
int SensorTcnt2 = 0; //Sensor 2
int SensorTcnt2 = 0; //Sensor 3

void loop(){
Delay(1000);
SensorTcnt1 = SensorTcnt1 + 1;
SensorTcnt2 = SensorTcnt2 + 1;
SensorTcnt3 = SensorTcnt3 + 1;

if(SensorTcnt1 = 3) //3秒讀一次Sensor 1
{
readSensor1();
SensorTcnt1 = 0;
}

if(SensorTcnt2 = 5) //5秒讀一次Sensor 2
{
readSensor2();
SensorTcnt2 = 0;
}

if(SensorTcnt3 = 10) //10秒讀一次Sensor 3
{
readSensor3();
SensorTcnt3 = 0;
}
}

上面的示例是比較懶的方式,時間會有誤差,誤差有多少就看你讀Sensor數目及時間長短;

也可以用CASE的指令去做,不過一樣會有時間的誤差,

標準的做法應該是用中斷去計時,而不是用Delay函數去計時.
越是親密的人 越需要你的尊重 ,尊重你的另一半 感情才能長長久久
不好意思,有點考古了
想請教一下
我想做水陸兩用車
關於偵測在水中還是陸上
我也是使用水位偵測模組



我想利用偵測到的水位數值
決定我要啟動水上的馬達電路
或者陸上的馬達電路
不知道這樣可行嗎?
  • 2
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?