從網上下載Arduino Modbus 程式庫, 下載到Arduino nano用QModbus試機正常。
然后在Arduino加上RS485小板,接到觸摸屏RS485試調0x,1x,3x,4x。 觸摸屏連接Arduino正常送數據了。 然后又加上一個DHT11,觸摸屏顯示溫度濕度。 分享給大家玩嚇!
制作出來的實物圖如下:
HMI_Arduino.jpg (61.83 KB, 下載次數: 168)
下載附件
2019-5-12 22:42 上傳
電路原理圖如下:
arduino_rs485.jpg (37.79 KB, 下載次數: 179)
下載附件
2019-5-12 22:35 上傳
HMI_PLC.JPG (22.53 KB, 下載次數: 179)
下載附件
2019-5-12 22:34 上傳
Arduino源程序如下:
- /**
- * Modbus slave example 2:
- * Thepurpose of this example is to link the Arduino digital and analog
- * pins to an external device.
- *
- * Recommended Modbus Master: QModbus
- *
- * Editado al español por LuxARTS由LuxARTS編輯為西班牙語
- */
- //-------------------------------------------------------------------------
- unsigned long previousMillis = 0; // will store last temp was read
- unsigned long currentMillis = 0;
- const long interval = 7000; // interval at which to readsensor
- #include <DHT.h>
- #define DHTPIN 12
- #define DHTTYPE DHT11
- DHT dht(DHTPIN,DHTTYPE);
- //-----------------------------------------------------------------------------
- //Incluye la librería del protocolo Modbus
- #include <ModbusRtu.h>
- #define ID 1
- //Crear instancia創建實例
- Modbus slave(ID, 0, 0); //ID del nodo. 0para el master, 1-247 para esclavo
- //節點的ID。 0表示主站,1-247表示從站
- //Puerto serie (0 = TX:1 - RX: 0)
- //串口(0 = TX:1 - RX:0)
- //Protocolo serie. 0para RS-232 + USB (default), cualquier pin mayor a 1 para RS-485
- //串行協議。 0表示RS-232 + USB(默認),任何大于1的引腳用于RS-485
- boolean led;
- int8_t state = 0;
- unsigned long tempus;
- uint16_t au16data[15]; //La tabla deregistros que se desea compartir por la red 要在共享的記錄表
- /*********************************************************
- Configuración del programa
- *********************************************************/
- void setup() {
- dht.begin();
- io_setup(); //configura las entradas y salidas配置輸入和輸出
- slave.begin(19200); //Abre la comunicación como esclavo作為奴通信
- tempus = millis() + 100; //Guarda el tiempo actual + 100ms保存當前時間+ 100ms
- digitalWrite(13, HIGH ); //Prende el led del pin 13 (el de la placa)打開引腳13的引腳(板上的引腳)
- }
- /*********************************************************
- Inicio del programa
- *********************************************************/
- void loop() {
- //Comprueba el buffer de entrada
- state = slave.poll( au16data, 15 ); //Parámetros: Tabla de registrospara el intercambio de info參數:信息交換的記錄表
- // Tamaño de la tabla de registros記錄表的大小
- //Devuelve0 si no hay pedido de datos如果沒有數據請求,則返回0
- //Devuelve1 al 4 si hubo error de comunicación如果存在通信錯誤,則返回1到4
- //Devuelvemas de 4 si se procesó correctamente el pedido如果訂單成功處理,則返回4個以上
- if(state > 4) { //Si es mayor a 4 = el pedido fué correcto如果大于4 =訂單是正確的
- tempus = millis() + 50; //Tiempo actual + 50ms當前時間+ 50ms
- digitalWrite(13, HIGH);//Prende el led打開LED
- }
- if(millis() > tempus) digitalWrite(13, LOW );//Apaga el led 50ms después之后關掉led 50ms
-
- //Actualizalos pines de Arduino con la tabla de Modbus使用Modbus表更新Arduino引腳
- io_poll();
- //----------------------------------------------------------------------
- currentMillis = millis();
- if(currentMillis - previousMillis >= interval)
- {
- previousMillis = currentMillis;
-
- int h = dht.readTemperature();
- int t = dht.readHumidity();
- if (isnan(t) || isnan(h))
- {
- delay(1);
- }
- else
- {
- au16data[11] = h;
- au16data[10] = t;
- delay(1);
- }
- }
- //--------------------------------------------------------------------
-
- }
- /**
- *pin maping:
- * 2- digital input
- * 3- digital input
- * 4- digital input
- * 5- digital input
- * 6- digital output
- * 7- digital output
- * 8- digital output
- * 9- digital output
- * 10- analog output
- * 11- analog output
- * 14- analog input
- * 15- analog input
- *
- *pin 13 reservado para ver el estado de la comunicación引腳13保留用于查看通信狀態
- */
- void io_setup() {
-
- pinMode(2, INPUT_PULLUP);
- pinMode(3, INPUT_PULLUP);
- pinMode(4, INPUT_PULLUP);
- pinMode(5, INPUT_PULLUP);
- pinMode(6, OUTPUT);
- pinMode(7,OUTPUT);
- pinMode(8, OUTPUT);
- pinMode(9, OUTPUT);
- pinMode(10, OUTPUT);
- pinMode(11, OUTPUT);
- pinMode(13, OUTPUT);
- digitalWrite(6, LOW );
- digitalWrite(7, LOW );
- digitalWrite(8, LOW );
- digitalWrite(9, LOW );
- digitalWrite(13, HIGH ); //Led del pin 13 de la placa板的引腳13的LED
- analogWrite(10, 0 ); //PWM 0%
- analogWrite(11, 0 ); //PWM 0%
- }
- /*********************************************************
- Enlaza la tabla de registros con los pines將記錄表與引腳鏈接
- *********************************************************/
- void io_poll() {
- //digital inputs -> au16data[0]
- //Lee las entradas digitales y las guarda en bits de la primera variable delvector讀取數字輸入并將其保存在向量的第一個變量的位中
- //(es lo mismo que hacer una máscara)(這和制作面具一樣)
- bitWrite( au16data[0], 0, digitalRead( 2 )); //Lee el pin 2 de Arduino ylo guarda en el bit 0 de la variable au16data[0]
- bitWrite( au16data[0], 1, digitalRead( 3 )); //讀取Arduino的引腳2并將其保存在變量au16data [0]的第0位
- bitWrite( au16data[0], 2, digitalRead( 4 ));
- bitWrite(au16data[0], 3, digitalRead( 5 ));
- //digital outputs -> au16data[1]
- //Lee los bits de la segunda variable y los pone en las salidas digitales讀取第二個變量的位并將它們放入數字輸出中
- digitalWrite( 6, bitRead( au16data[1], 0 )); //Lee el bit 0 de lavariable au16data[1] y lo pone en el pin 6 de Arduino
- digitalWrite( 7, bitRead( au16data[1], 1 )); //讀取變量au16data [1]的第0位并將其放在Arduino的第6引腳上
- digitalWrite( 8, bitRead( au16data[1], 2 ));
- digitalWrite( 9, bitRead( au16data[1], 3 ));
- //Cambia el valor del PWM更改PWM的值
- analogWrite( 10, au16data[2] ); //El valor de au16data[2] se escribe enla salida de PWM del pin 10 de Arduino. (siendo 0=0% y 255=100%)
- analogWrite( 11, au16data[3] ); //au16data [2]的值寫入Arduino引腳10的PWM輸出。 (0 = 0%,255 = 100%)
- //Lee las entradas analógicas (ADC)讀取模擬輸入(ADC)
- au16data[4] = analogRead( 0 ); //El valor analógico leido en el pin A0se guarda en au16data[4]. (siendo 0=0v y 1023=5v)
- au16data[5] = analogRead( 1 ); //在引腳A0上讀取的模擬值存儲在au16data [4]中。 (0 = 0v和1023 = 5v)
- //Diagnóstico de la comunicación (para debug)通信診斷(用于調試)
- au16data[6] = slave.getInCnt(); //Devuelve cuantos mensajes se recibieron返回收到的消息數
- au16data[7] = slave.getOutCnt(); //Devuelve cuantos mensajes setransmitieron返回傳輸的消息數
- au16data[8] = slave.getErrCnt(); //Devuelve cuantos errores hubieron返回有多少錯誤
- }
復制代碼
全部資料51hei下載地址:
Modbus-Master-Slave-for-Arduino-master.zip
(200.82 KB, 下載次數: 199)
2019-5-12 23:17 上傳
點擊文件名下載附件
Arduino_Modbus 下載積分: 黑幣 -5
|