Датчики используются PR-fxjt и PR-fsjt. Подключены плате hw-97, которая подключена к плате ардуино нано к пинам D2, D3, D7, D8.
Вот код:
//#include <ModbusMaster.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#define RE 8
#define DE 7
uint8_t reg_data[8] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x0B};
uint8_t reg_data_1[8] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A};
//byte Anemometer_request[] = {0x01, 0x03, 0x00, 0x16, 0x00, 0x01, 0x65, 0xCE};
uint8_t Anemometer_request[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A};
uint8_t Anemometer_request_1[] = {0x01, 0x03, 0x00, 0x16, 0x00, 0x01, 0x65, 0xCE};
uint8_t receive_data[19];
uint8_t receive_data_1[19];
float reg1, reg2, reg3, reg4, reg5, reg6, reg7, crc16;
uint32_t display_timer = 0, read_timer = 0;
byte values[11];
bool state = true;
SoftwareSerial mod(2, 3);
SoftwareSerial mod2(2, 3);
//ModbusMaster node;
/*void preTransmission()
{
digitalWrite(DE, HIGH);
digitalWrite(RE, HIGH);
}
void postTransmission()
{
digitalWrite(DE, LOW);
digitalWrite(RE, LOW);
}
*/
void readData() {
// tranmission enable
Serial.println("========================");
mod.begin(4800);
digitalWrite(DE, HIGH);
digitalWrite(RE, HIGH);
if (mod.write(Anemometer_request, sizeof(Anemometer_request)) == 8) {
// receiving enable
mod.flush();
byte Anemometer_buf[8];
digitalWrite(DE, LOW);
digitalWrite(RE, LOW);
//mod.readBytes(receive_data, 19);
mod.readBytes(Anemometer_buf, 8);
Serial.println("OK!!!!!");
for (int i=0; i<8; i++)
{
Serial.print(Anemometer_buf[i]);
}
Serial.println();
Serial.print(Anemometer_buf[4]);
Serial.print(" m/s");
//Serial.println(reg1);
Serial.println("=======");
// Serial.write(receive_data, sizeof(receive_data));
reg1 = receive_data[3] << 8 | receive_data[4];
reg1 = reg1 / 10;
//reg2 = receive_data[5] << 8 | receive_data[6];
//reg2 = reg2 / 10;
}
mod.end();
delay(1000);
mod2.begin(4800);
if (mod2.write(Anemometer_request_1, sizeof(Anemometer_request_1)) == 8) {
// receiving enable
mod2.flush();
byte Anemometer_buf2[8];
digitalWrite(DE, LOW);
digitalWrite(RE, LOW);
Serial.println("OK!!!!!");
//mod2.readBytes(receive_data_1, 19);
mod2.readBytes(Anemometer_buf2, 8);
for (int i=0; i<19; i++)
{
Serial.print(Anemometer_buf2[i]);
}
Serial.println();
Serial.print(Anemometer_buf2[4]);
Serial.print(" m/s");
//Serial.println(reg1);
Serial.println("=======");
// Serial.write(receive_data, sizeof(receive_data));
reg1 = receive_data[3] << 8 | receive_data[4];
reg1 = reg1 / 10;
//reg2 = receive_data[5] << 8 | receive_data[6];
//reg2 = reg2 / 10;
}
mod2.end();
Serial.println("========================");
}
void setup() {
Serial.begin(9600);//9600
//Serial1.begin(9600);
//mod.begin(4800);
//mod2.begin(4800);
/*if (!ModbusRTUClient.begin(4800, SERIAL_8E1)) {
Serial.println("Failed to start Modbus RTU Client!");
while (1);
}*/
pinMode(RE, OUTPUT);
pinMode(DE, OUTPUT);
//node.begin(1, Serial);
//node.preTransmission(preTransmission);
//node.postTransmission(postTransmission);
delay(1000);
}
void loop() {
if (millis() - display_timer >= 1000) {
/*Serial.print("Wind speed: ");
//speed_val = analogRead(speed_pin);
sensorValue = analogRead(speed_pin);
sensorVoltage = sensorValue * voltageConversionConstant;
if (sensorVoltage <= voltageMin){
windSpeed = 0; //Check if voltage is below minimum value. If so, set wind speed to zero.
}else {
windSpeed = (sensorVoltage - voltageMin)*windSpeedMax/(voltageMax - voltageMin); //For voltages above minimum value, use the linear relationship to calculate wind speed.
}
Serial.println(windSpeed);*/
//Serial.println(speed_val);
/*uint8_t result;
result = node.writeSingleCoil(0x01, state);
state = !state;
result = node.readInputRegisters(0x03,6);
if (result == node.ku8MBSuccess)
{
Serial.println(node.getResponseBuffer(0x00)/100.0f);
Serial.println(node.getResponseBuffer(0x02)/100.0f);
Serial.println(node.getResponseBuffer(0xC4)/100.0f);
Serial.println(node.getResponseBuffer(0x0B)/100.0f);
}
else
{
Serial.println("Error");
}*/
/*if (!ModbusRTUClient.requestFrom(1, HOLDING_REGISTERS, 0x01, 2))
{
Serial.print("failed to read registers! ");
Serial.println(ModbusRTUClient.lastError());
}
else
{
// If the request succeeds, the sensor sends the readings, that are
// stored in the holding registers. The read() method can be used to
// get the raw temperature and the humidity values.
short wind_speed = ModbusRTUClient.read();
Serial.println(wind_speed);
}*/
readData();
display_timer = millis();
Serial.print("Wind speed: ");
Serial.print(reg1);
Serial.println();
Serial.print("Wind direction: ");
Serial.print(reg2);
Serial.println("°");
}
}