从网上下载Arduino Modbus 程式庫, 下载到Arduino nano用QModbus试机正常。
然后在Arduino加上RS485小板,接到触摸屏RS485试调0x,1x,3x,4x。 触摸屏连接Arduino正常送数据了。 然后又加上一个DHT11,触摸屏显示温度湿度。 分享给大家玩吓! 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)
|