找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 26798|回復: 27
收起左側

Arduino連接RS485觸摸屏 附程序

  [復制鏈接]
ID:330820 發(fā)表于 2019-5-12 22:50 | 顯示全部樓層 |閱讀模式

從網上下載
Arduino Modbus 程式庫, 下載到Arduino nanoQModbus試機正常。
然后在Arduino加上RS485小板,接到觸摸屏RS485試調0x,1x,3x,4x。
觸摸屏連接Arduino正常送數(shù)據了。
然后又加上一個DHT11,觸摸屏顯示度濕度。
分享給大家玩嚇!

制作出來的實物圖如下:
HMI_Arduino.jpg

電路原理圖如下:
arduino_rs485.jpg HMI_PLC.JPG

Arduino源程序如下:
  1. /**
  2. * Modbus slave example 2:
  3. *  Thepurpose of this example is to link the Arduino digital and analog
  4. *    pins to an external device.
  5. *
  6. * Recommended Modbus Master: QModbus
  7. *
  8. * Editado al español por LuxARTS由LuxARTS編輯為西班牙語
  9. */
  10. //-------------------------------------------------------------------------
  11. unsigned long previousMillis = 0;        // will store last temp was read
  12. unsigned long currentMillis = 0;
  13. const long interval = 7000;              // interval at which to readsensor
  14. #include <DHT.h>
  15. #define DHTPIN 12   
  16. #define DHTTYPE DHT11
  17. DHT dht(DHTPIN,DHTTYPE);
  18. //-----------------------------------------------------------------------------
  19. //Incluye la librería del protocolo Modbus
  20. #include <ModbusRtu.h>
  21. #define ID  1
  22. //Crear instancia創(chuàng)建實例
  23. Modbus slave(ID, 0, 0); //ID del nodo. 0para el master, 1-247 para esclavo
  24.                         //節(jié)點的ID。 0表示主站,1-247表示從站
  25.                         //Puerto serie (0 = TX:1 - RX: 0)
  26.                         //串口(0 = TX:1 -  RX:0)
  27.                         //Protocolo serie. 0para RS-232 + USB (default), cualquier pin mayor a 1 para RS-485
  28.                         //串行協(xié)議。 0表示RS-232 + USB(默認),任何大于1的引腳用于RS-485
  29. boolean led;
  30. int8_t state = 0;
  31. unsigned long tempus;
  32. uint16_t au16data[15]; //La tabla deregistros que se desea compartir por la red 要在共享的記錄表
  33. /*********************************************************
  34. Configuración del programa
  35. *********************************************************/
  36. void setup() {
  37.   dht.begin();
  38. io_setup(); //configura las entradas y salidas配置輸入和輸出
  39. slave.begin(19200); //Abre la comunicación como esclavo作為奴通信
  40. tempus = millis() + 100; //Guarda el tiempo actual + 100ms保存當前時間+ 100ms
  41. digitalWrite(13, HIGH ); //Prende el led del pin 13 (el de la placa)打開引腳13的引腳(板上的引腳)
  42. }
  43. /*********************************************************
  44. Inicio del programa
  45. *********************************************************/
  46. void loop() {
  47. //Comprueba el buffer de entrada
  48. state = slave.poll( au16data, 15 ); //Parámetros: Tabla de registrospara el intercambio de info參數(shù):信息交換的記錄表
  49.                                      //            Tamaño de la tabla de registros記錄表的大小
  50.                                      //Devuelve0 si no hay pedido de datos如果沒有數(shù)據請求,則返回0
  51.                                      //Devuelve1 al 4 si hubo error de comunicación如果存在通信錯誤,則返回1到4
  52.                                      //Devuelvemas de 4 si se procesó correctamente el pedido如果訂單成功處理,則返回4個以上
  53.   if(state > 4) { //Si es mayor a 4 = el pedido fué correcto如果大于4 =訂單是正確的
  54.    tempus = millis() + 50; //Tiempo actual + 50ms當前時間+ 50ms
  55.    digitalWrite(13, HIGH);//Prende el led打開LED
  56.   }
  57.   if(millis() > tempus) digitalWrite(13, LOW );//Apaga el led 50ms después之后關掉led 50ms
  58.   
  59.   //Actualizalos pines de Arduino con la tabla de Modbus使用Modbus表更新Arduino引腳
  60. io_poll();
  61. //----------------------------------------------------------------------
  62.         currentMillis = millis();
  63.          if(currentMillis - previousMillis >= interval)
  64.          {                                             
  65.          previousMillis = currentMillis;   
  66.         
  67.       int h = dht.readTemperature();
  68.       int t = dht.readHumidity();
  69.          if (isnan(t) || isnan(h))
  70.             {
  71.            delay(1);
  72.               }
  73.           else
  74.            {
  75.             au16data[11] = h;
  76.             au16data[10] = t;
  77.            delay(1);
  78.             }
  79.          }      
  80. //--------------------------------------------------------------------
  81.   
  82. }
  83. /**
  84. *pin maping:
  85. * 2- digital input
  86. * 3- digital input
  87. * 4- digital input
  88. * 5- digital input
  89. * 6- digital output
  90. * 7- digital output
  91. * 8- digital output
  92. * 9- digital output
  93. * 10- analog output
  94. * 11- analog output
  95. * 14- analog input
  96. * 15- analog input
  97. *
  98. *pin 13 reservado para ver el estado de la comunicación引腳13保留用于查看通信狀態(tài)
  99. */
  100. void io_setup() {
  101.   
  102. pinMode(2, INPUT_PULLUP);
  103. pinMode(3, INPUT_PULLUP);
  104. pinMode(4, INPUT_PULLUP);
  105. pinMode(5, INPUT_PULLUP);
  106. pinMode(6, OUTPUT);
  107.   pinMode(7,OUTPUT);
  108. pinMode(8, OUTPUT);
  109. pinMode(9, OUTPUT);
  110. pinMode(10, OUTPUT);
  111. pinMode(11, OUTPUT);
  112. pinMode(13, OUTPUT);
  113. digitalWrite(6, LOW );
  114. digitalWrite(7, LOW );
  115. digitalWrite(8, LOW );
  116. digitalWrite(9, LOW );
  117. digitalWrite(13, HIGH ); //Led del pin 13 de la placa板的引腳13的LED
  118. analogWrite(10, 0 ); //PWM 0%
  119. analogWrite(11, 0 ); //PWM 0%
  120. }
  121. /*********************************************************
  122. Enlaza la tabla de registros con los pines將記錄表與引腳鏈接
  123. *********************************************************/
  124. void io_poll() {
  125.   //digital inputs -> au16data[0]
  126.   //Lee las entradas digitales y las guarda en bits de la primera variable delvector讀取數(shù)字輸入并將其保存在向量的第一個變量的位中
  127.   //(es lo mismo que hacer una máscara)(這和制作面具一樣)
  128. bitWrite( au16data[0], 0, digitalRead( 2 )); //Lee el pin 2 de Arduino ylo guarda en el bit 0 de la variable au16data[0]
  129. bitWrite( au16data[0], 1, digitalRead( 3 )); //讀取Arduino的引腳2并將其保存在變量au16data [0]的第0位
  130. bitWrite( au16data[0], 2, digitalRead( 4 ));
  131.   bitWrite(au16data[0], 3, digitalRead( 5 ));
  132.   //digital outputs -> au16data[1]
  133.   //Lee los bits de la segunda variable y los pone en las salidas digitales讀取第二個變量的位并將它們放入數(shù)字輸出中
  134. digitalWrite( 6, bitRead( au16data[1], 0 )); //Lee el bit 0 de lavariable au16data[1] y lo pone en el pin 6 de Arduino
  135. digitalWrite( 7, bitRead( au16data[1], 1 )); //讀取變量au16data [1]的第0位并將其放在Arduino的第6引腳上
  136. digitalWrite( 8, bitRead( au16data[1], 2 ));
  137. digitalWrite( 9, bitRead( au16data[1], 3 ));
  138.   //Cambia el valor del PWM更改PWM的值
  139. 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%)
  140. analogWrite( 11, au16data[3] ); //au16data [2]的值寫入Arduino引腳10的PWM輸出。 (0 = 0%,255 = 100%)
  141.   //Lee las entradas analógicas (ADC)讀取模擬輸入(ADC)
  142. au16data[4] = analogRead( 0 ); //El valor analógico leido en el pin A0se guarda en au16data[4]. (siendo 0=0v y 1023=5v)
  143. au16data[5] = analogRead( 1 ); //在引腳A0上讀取的模擬值存儲在au16data [4]中。 (0 = 0v和1023 = 5v)
  144.   //Diagnóstico de la comunicación (para debug)通信診斷(用于調試)
  145. au16data[6] = slave.getInCnt(); //Devuelve cuantos mensajes se recibieron返回收到的消息數(shù)
  146. au16data[7] = slave.getOutCnt(); //Devuelve cuantos mensajes setransmitieron返回傳輸?shù)南?shù)
  147. au16data[8] = slave.getErrCnt(); //Devuelve cuantos errores hubieron返回有多少錯誤
  148. }
復制代碼

全部資料51hei下載地址:
Modbus-Master-Slave-for-Arduino-master.zip (200.82 KB, 下載次數(shù): 199)

評分

參與人數(shù) 3黑幣 +75 收起 理由
luliang02003 + 15
weidoit + 10 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:340816 發(fā)表于 2019-7-6 14:39 | 顯示全部樓層
樓主有聯(lián)系方式嗎?關于觸摸屏和arduino,可以指點一下嗎?有償。。!
回復

使用道具 舉報

ID:340816 發(fā)表于 2019-7-6 18:37 | 顯示全部樓層
樓主大大,想請教一下你用arduino nano和電腦是怎么連線測試的?
回復

使用道具 舉報

ID:330820 發(fā)表于 2019-7-9 11:02 | 顯示全部樓層
cuixiaodong 發(fā)表于 2019-7-6 18:37
樓主大大,想請教一下你用arduino nano和電腦是怎么連線測試的?

下載Arduino Modbus 程式庫, 下載到Arduino nano用QModbus試機。

然后在Arduino加上RS485小板,接到觸摸屏RS485試調0x,1x,3x,4x。
回復

使用道具 舉報

ID:149389 發(fā)表于 2019-8-23 16:34 | 顯示全部樓層
Kinco HMIware + Proteus ,純軟件仿真通過。
回復

使用道具 舉報

ID:149389 發(fā)表于 2019-8-23 22:18 | 顯示全部樓層
一、HMI仿真畫面
001.png 二、AD采集電路

002.png
三、PWM信號輸出波形
003.png
四、數(shù)字輸入、數(shù)字輸出、DHT11傳感器電路

004.png



回復

使用道具 舉報

ID:330820 發(fā)表于 2019-8-26 15:40 | 顯示全部樓層
GOOOOOD!!!!!
51黑有你更精彩!!!
回復

使用道具 舉報

ID:405825 發(fā)表于 2019-9-17 08:40 | 顯示全部樓層
非常好!看到這篇文章的時候,我感覺51黑電子論壇真是太強大了。rduino好多人都是拿它來玩玩或者練手,而HMI和PLC的結合才是運用到工業(yè)上的。去年的時候,我要做一個輥軸表面溫度檢測的項目,最后選擇了非接觸紅外傳感器MLX90614,但它與PLC的連接卻比較麻煩,而和ARDUINO的連接卻非常方便。用arduinor編寫PID算法也很好用(感覺比PLC自帶的PID好用得多)。當時就想著要是arduino如果能直接跟HMI通訊就更完美了!
回復

使用道具 舉報

ID:428400 發(fā)表于 2019-9-17 19:33 | 顯示全部樓層
可以和觸摸屏通訊?z真的可以?
回復

使用道具 舉報

ID:428400 發(fā)表于 2019-9-19 20:23 | 顯示全部樓層
這個好,有空也試一下
回復

使用道具 舉報

ID:405825 發(fā)表于 2019-9-22 09:04 | 顯示全部樓層
前輩你好,觸摸屏上的寄存器如何定義?我想把arduino上獲得的溫度顯示到屏上。謝謝
回復

使用道具 舉報

ID:330820 發(fā)表于 2019-9-25 09:32 | 顯示全部樓層
pyramidlei 發(fā)表于 2019-9-22 09:04
前輩你好,觸摸屏上的寄存器如何定義?我想把arduino上獲得的溫度顯示到屏上。謝謝

有觸摸屏資料。

Modbus_Kinco_Arduino.rar

6.03 MB, 下載次數(shù): 76, 下載積分: 黑幣 -5

回復

使用道具 舉報

ID:50830 發(fā)表于 2019-11-10 12:06 | 顯示全部樓層
樓主,好像地址號,不能從0號開始了,如16功能號,digitalWrite( 6, bitRead( au16data[1], 0 ));這個,就得從地址號16號開始的,不能修改嗎?
回復

使用道具 舉報

ID:428400 發(fā)表于 2019-11-27 18:48 | 顯示全部樓層
學習了。謝謝分享@
回復

使用道具 舉報

ID:650686 發(fā)表于 2019-11-28 12:22 | 顯示全部樓層
樓主這個好
回復

使用道具 舉報

ID:652081 發(fā)表于 2019-11-29 03:28 | 顯示全部樓層
不錯不錯
回復

使用道具 舉報

ID:655699 發(fā)表于 2019-12-4 11:01 | 顯示全部樓層
給力!謝謝大佬!
回復

使用道具 舉報

ID:656167 發(fā)表于 2019-12-4 18:53 | 顯示全部樓層
真的太好了!非常感謝。
回復

使用道具 舉報

ID:675398 發(fā)表于 2020-1-3 10:00 | 顯示全部樓層
感謝樓主
回復

使用道具 舉報

ID:557635 發(fā)表于 2020-1-5 08:31 | 顯示全部樓層
真的太好了!非常感謝。
回復

使用道具 舉報

ID:708939 發(fā)表于 2020-3-15 17:05 | 顯示全部樓層
想用ARUDUINO獲取幾個溫度然后用力控通過rtu訪問
回復

使用道具 舉報

ID:758541 發(fā)表于 2020-7-7 18:43 | 顯示全部樓層
UNO的板子可以通用程序嗎?新手小白,求助
回復

使用道具 舉報

ID:801109 發(fā)表于 2020-7-18 09:21 | 顯示全部樓層
大家有modbus庫么?麻煩發(fā)一份給,我從軟件上下載的相關庫都報錯了,謝謝哦!

報錯內容

報錯內容
回復

使用道具 舉報

ID:330820 發(fā)表于 2020-7-23 11:56 | 顯示全部樓層
在這里有!!!
全部資料51hei下載地址:
Modbus-Master-Slave-for-Arduino-master.zip (200.82 KB,下載次數(shù):73)
回復

使用道具 舉報

ID:514042 發(fā)表于 2022-7-1 15:42 | 顯示全部樓層
weidoit 發(fā)表于 2019-8-23 22:18
一、HMI仿真畫面
二、AD采集電路

你好 最近在弄步科觸摸屏和Arduino通訊 可以交流一下嗎
回復

使用道具 舉報

ID:873592 發(fā)表于 2022-7-14 09:35 | 顯示全部樓層
樓主厲害啊
回復

使用道具 舉報

ID:865842 發(fā)表于 2022-11-17 11:38 | 顯示全部樓層
應該可以移植到non esp8266上面的
回復

使用道具 舉報

ID:280298 發(fā)表于 2024-7-9 08:15 | 顯示全部樓層
Arduino 還是可以的,就是移植的時候,得把底層庫搞一下
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表