大家好~不好意思~我是ARDUINO新手,我一直有個問題搞不清楚,就是有關啟動或關閉某個設備的程式碼編寫。
大致上是這樣:
我希望我的遙控船
在水池水位到達一定的的水位高度後→→ 啟動馬達。
但是希望就算水位高度達啟動馬達的狀態,不過馬達偵測器偵測到馬達轉數高於3200轉/分後→→關閉馬達。
請問在ARDUINO上面該如何表示這樣的語法?
int waterlabel; //定義水位
waterlabel = analogRead(0); //水位是類比0的位置
if (waterlabel > 480) //如果水位大於480
{
digitalWrite(2, HIGH); // 開繼電器讓馬達轉
}
.....但是馬達高達3200轉,停掉馬達的程式.....我就不會寫了。
另外想請問一下,當水位在臨界時,RELAY會一直啟動關閉啟動關閉,似乎是因為水位在臨界時數值會上下跑,除了用delay(1000)等方法避免外,有沒有其他方式???
if 水位>480 並且 馬達轉速<3200 ,啟動馬達
if 水位<450 或者 馬達轉速>3200 ,關閉馬達
要避免因為數值變動而開開關關,可以把開啟與關閉值設定為一個區間。
水位到達480才會啟動,降低到450才會關閉馬達。
這樣假設水位在490~470之間浮動時就不會開開關關。
馬達轉速雖然也可以這樣處理,但是僅用開跟關來控制,
會面臨馬達不斷加速(啟動)、減速(關閉)。
控制馬達需要控制電壓,直流馬達轉速跟電壓有關連,
使用PWM調壓控制才能穩住馬達的轉速。
這個部分可能要搭配其他電路,我就沒有玩這麼多了,
Arduino雖然也有PWM輸出功能,但是電流輸出有限,
吃電大的馬達就不適合了。
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一段時間再讀取一次,狀態相同才執行。
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函數去計時.
越是親密的人 越需要你的尊重 ,尊重你的另一半 感情才能長長久久
內文搜尋

X