找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 22477|回复: 26
收起左侧

Arduino连接RS485触摸屏 附程序

  [复制链接]
ID:330820 发表于 2019-5-12 22:50 | 显示全部楼层 |阅读模式

从网上下载
Arduino Modbus 程式庫, 下载到Arduino nanoQModbus试机正常。
然后在Arduino加上RS485小板,接到触摸屏RS485试调0x,1x,3x,4x
触摸屏连接Arduino正常送数据了。
然后又加上一个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创建实例
  23. Modbus slave(ID, 0, 0); //ID del nodo. 0para el master, 1-247 para esclavo
  24.                         //节点的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.                         //串行协议。 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参数:信息交换的记录表
  49.                                      //            Tamaño de la tabla de registros记录表的大小
  50.                                      //Devuelve0 si no hay pedido de datos如果没有数据请求,则返回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保留用于查看通信状态
  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读取数字输入并将其保存在向量的第一个变量的位中
  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读取第二个变量的位并将它们放入数字输出中
  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返回收到的消息数
  146. au16data[7] = slave.getOutCnt(); //Devuelve cuantos mensajes setransmitieron返回传输的消息数
  147. au16data[8] = slave.getErrCnt(); //Devuelve cuantos errores hubieron返回有多少错误
  148. }
复制代码

全部资料51hei下载地址:
Modbus-Master-Slave-for-Arduino-master.zip (200.82 KB, 下载次数: 186)

评分

参与人数 3黑币 +75 收起 理由
luliang02003 + 15
weidoit + 10 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:340816 发表于 2019-7-6 14:39 | 显示全部楼层
楼主有联系方式吗?关于触摸屏和arduino,可以指点一下吗?有偿!!!!
回复

使用道具 举报

ID:340816 发表于 2019-7-6 18:37 | 显示全部楼层
楼主大大,想请教一下你用arduino nano和电脑是怎么连线测试的?
回复

使用道具 举报

ID:330820 发表于 2019-7-9 11:02 | 显示全部楼层
cuixiaodong 发表于 2019-7-6 18:37
楼主大大,想请教一下你用arduino nano和电脑是怎么连线测试的?

下载Arduino Modbus 程式庫, 下载到Arduino nano用QModbus试机。

然后在Arduino加上RS485小板,接到触摸屏RS485试调0x,1x,3x,4x。
回复

使用道具 举报

ID:149389 发表于 2019-8-23 16:34 | 显示全部楼层
Kinco HMIware + Proteus ,纯软件仿真通过。
回复

使用道具 举报

ID:149389 发表于 2019-8-23 22:18 | 显示全部楼层
一、HMI仿真画面
001.png 二、AD采集电路

002.png
三、PWM信号输出波形
003.png
四、数字输入、数字输出、DHT11传感器电路

004.png



回复

使用道具 举报

ID:330820 发表于 2019-8-26 15:40 | 显示全部楼层
GOOOOOD!!!!!
51黑有你更精彩!!!
回复

使用道具 举报

ID:405825 发表于 2019-9-17 08:40 | 显示全部楼层
非常好!!看到这篇文章的时候,我感觉51黑电子论坛真是太强大了!!arduino好多人都是拿它来玩玩或者练手,而HMI和PLC的结合才是运用到工业上的。去年的时候,我要做一个辊轴表面温度检测的项目,最后选择了非接触红外传感器MLX90614,但它与PLC的连接却比较麻烦,而和ARDUINO的连接却非常方便。用arduinor编写PID算法也很好用(感觉比PLC自带的PID好用得多)。当时就想着要是arduino如果能直接跟HMI通讯就更完美了!
回复

使用道具 举报

ID:428400 发表于 2019-9-17 19:33 | 显示全部楼层
可以和触摸屏通讯?z真的可以?
回复

使用道具 举报

ID:428400 发表于 2019-9-19 20:23 | 显示全部楼层
这个好,有空也试一下
回复

使用道具 举报

ID:405825 发表于 2019-9-22 09:04 | 显示全部楼层
前辈你好,触摸屏上的寄存器如何定义?我想把arduino上获得的温度显示到屏上。谢谢
回复

使用道具 举报

ID:330820 发表于 2019-9-25 09:32 | 显示全部楼层
pyramidlei 发表于 2019-9-22 09:04
前辈你好,触摸屏上的寄存器如何定义?我想把arduino上获得的温度显示到屏上。谢谢

有触摸屏資料。

Modbus_Kinco_Arduino.rar

6.03 MB, 下载次数: 72, 下载积分: 黑币 -5

回复

使用道具 举报

ID:50830 发表于 2019-11-10 12:06 | 显示全部楼层
楼主,好像地址号,不能从0号开始了,如16功能号,digitalWrite( 6, bitRead( au16data[1], 0 ));这个,就得从地址号16号开始的,不能修改吗?
回复

使用道具 举报

ID:428400 发表于 2019-11-27 18:48 | 显示全部楼层
学习了。谢谢分享@
回复

使用道具 举报

ID:650686 发表于 2019-11-28 12:22 | 显示全部楼层
楼主这个好
回复

使用道具 举报

ID:652081 发表于 2019-11-29 03:28 | 显示全部楼层
不错不错
回复

使用道具 举报

ID:655699 发表于 2019-12-4 11:01 | 显示全部楼层
给力!谢谢大佬!
回复

使用道具 举报

ID:656167 发表于 2019-12-4 18:53 | 显示全部楼层
真的太好了!非常感谢。
回复

使用道具 举报

ID:675398 发表于 2020-1-3 10:00 | 显示全部楼层
感谢楼主
回复

使用道具 举报

ID:557635 发表于 2020-1-5 08:31 | 显示全部楼层
真的太好了!非常感谢。
回复

使用道具 举报

ID:708939 发表于 2020-3-15 17:05 | 显示全部楼层
想用ARUDUINO获取几个温度然后用力控通过rtu访问
回复

使用道具 举报

ID:758541 发表于 2020-7-7 18:43 | 显示全部楼层
UNO的板子可以通用程序吗?新手小白,求助
回复

使用道具 举报

ID:801109 发表于 2020-7-18 09:21 | 显示全部楼层
大家有modbus库么?麻烦发一份给,我从软件上下载的相关库都报错了,谢谢哦!

报错内容

报错内容
回复

使用道具 举报

ID:330820 发表于 2020-7-23 11:56 | 显示全部楼层
在這里有!!!
全部資料51hei下載地址:
Modbus-Master-Slave-for-Arduino-master.zip (200.82 KB,下載次數:73)
回复

使用道具 举报

ID:514042 发表于 2022-7-1 15:42 | 显示全部楼层
weidoit 发表于 2019-8-23 22:18
一、HMI仿真画面
二、AD采集电路

你好 最近在弄步科触摸屏和Arduino通讯 可以交流一下吗
回复

使用道具 举报

ID:873592 发表于 2022-7-14 09:35 | 显示全部楼层
楼主厉害啊
回复

使用道具 举报

ID:865842 发表于 2022-11-17 11:38 | 显示全部楼层
应该可以移植到non esp8266上面的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表