MAX485 TTL to RS485 Где на этой плате пины RE и DE?

картинка

Возрадуйся! Тебе досталась плата без управления направлением передачи. Попробуй просто писать и читать. Вдруг получится.

2 лайка

не говорите глупостей , есть там управление просто он автоматическое. Отслеживает начало передачи и переключает на TX

Объясни, в чём глупость? Может быть на плате есть вход для управления направлением передачи? Если найдёшь - молодец, макнул в субстанцию. Если не найдёшь - требую извинений и прошу в будущем более ответственно подходить к написанию постов.
И, я знаю где у восьминогой МС ноги DE ~RE.

Возможно я не правильно понял Ваш пост, в таком случае извините

конечно получится главное про землю не забыть

Любопытствую для чего юзаете RS485:

  1. Гальваноразвязки там нет? Питание от каждого устройства?
  2. Сколько устройств вешаете?
  3. Скорость?

Просто я для 10 метров юзаю простой USART 5-вольтовый, однако на каждое устройство гальваноразвязка через оптроны. 9600бод, до 12 вешал устройств. ТХ там усиливался транзисторами, чтобы оптроны продавить, им давал 3мА вроде.

а я для 40 метров юзаю простой HC-12 с такой же скоростью. только проводов нет. На таком расстоянии за городом JDY-40 умудряется искажать данные, а HC-12 - никогда.

3 лайка

для пром. оборудования юзать радио странновато, но надо посмотреть чо как. В моём случае ещё и лишние задержки нежелательны, в случае радио они наверное могут быть.

Стоит в 2 раза больше чем JDY-40. Во сне JDY-40 потребляет 20мкА, а дальность до 120 метров. Модуль HC-12 будет явно больше кушать. Там ведь на борту ещё и стмка.

А свою программку туда дописать можно? Надо несколько команд, адресацию добавить.

это делается протоколом передачи и не надо ничего дописывать

Есть датчики которые я хотел бы завязать с ардуино. Например ДУ180. Там можно конечно чистоту с 300 до 480ГГц отследить, но хотелось бы по RS. Но там протокол к сожалению не MODBUS, а Omnicomm LLS. Данных по этому протоколу у меня нет, я не нашел…

Никто не говорил, что он меньше кушает, я говорил, что у него дальность больше. А так, да, жрёть он 16мА, но если устройство автономное, это решается ключом по питанию на любом P-MOSFETе, хоть бы даже и на АО3401

40 метров против 120 метров у JDY-40??? К тому же 433 МГц диапазон очень захламлён, по этому ошибок передачи будет в разы больше. Зависимость будет больше от местности применения. На даче нормально, для города хуже. Да и дежурка 16 мА против 20 мкА для меня критична. ИМХО

Ты почитай, у НС-12 дальность 1800м штатно, по паспорту, против 100 у JDY-40

Конкретно по этому датчику, вдруг кому нужно будет) я настроил его как частотный, 2 датчика это вывод на 2 и 3 цифровой пин. там передается цифровой сигнал 0-5v с частотой от 300 до 480ггц. Вывод по зеленной жиле. Так как выходит там 10V, требуется понизить напряжение с помощью резисторов (переменные не подойдут). Нужно взять 10кОм и 15Ком. БП для датчиков в данный момент использую 22V. Данные вывожу на дисплей LCD2004

Схема

код

`#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Constants for Channel 1
const int SIGNAL_PIN_1 = 2;
const unsigned long MEASUREMENT_PERIOD_1 = 250;
const unsigned long LONG_MEASUREMENT_PERIOD_1 = 1000;
const unsigned long PULSE_TIMEOUT_1 = 3500;
const float MIN_FREQUENCY_1 = 300.0;
const float MAX_FREQUENCY_1 = 480.0;
const float DEGREE_PER_HZ_1 = 1.0;
const float LARGE_CHANGE_THRESHOLD_1 = 5.0;
const float ANGLE_OFFSET_1 = 10.0;
const float CORRECTION_FACTOR_1 = 0.0555555555555556; // Correction per degree

// Constants for Channel 2
const int SIGNAL_PIN_2 = 3;
const unsigned long MEASUREMENT_PERIOD_2 = 250;
const unsigned long LONG_MEASUREMENT_PERIOD_2 = 1000;
const unsigned long PULSE_TIMEOUT_2 = 3500;
const float MIN_FREQUENCY_2 = 300.0;
const float MAX_FREQUENCY_2 = 480.0;
const float DEGREE_PER_HZ_2 = 1.0;
const float LARGE_CHANGE_THRESHOLD_2 = 5.0;
const float ANGLE_OFFSET_2 = 10.0;
const float CORRECTION_FACTOR_2 = 0.0555555555555556; // Correction per degree

LiquidCrystal_I2C lcd(0x27, 20, 4);

// Variables for Channel 1
float lastDisplayedAngle_1 = 0.0;
unsigned long lastMeasurementTime_1 = 0;

// Variables for Channel 2
float lastDisplayedAngle_2 = 0.0;
unsigned long lastMeasurementTime_2 = 0;

// Function to measure angle for a specific channel
float measureAngle(int signalPin, unsigned long pulseTimeout, float minFrequency, float maxFrequency, float degreePerHz) {
unsigned long duration = pulseIn(signalPin, HIGH, pulseTimeout);
float frequency = 0.0;

if (duration > 0) {
frequency = 1000000.0 / (2.0 * duration);

if (frequency >= maxFrequency) {
  return 180.0;
}

if (frequency < minFrequency) {
  Serial.println("Frequency below minimum!");
  return 0.0;
}

return (frequency - minFrequency) * degreePerHz;

} else {
Serial.println(“No pulse detected!”);
return -1.0;
}
}

void setup() {
Serial.begin(115200);
pinMode(SIGNAL_PIN_1, INPUT);
pinMode(SIGNAL_PIN_2, INPUT);
Wire.begin();
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(“Angle1 (Deg):”);
lcd.setCursor(0, 2);
lcd.print(“Angle2 (Deg):”);
}

void loop() {
unsigned long currentTime = millis();

// Process Channel 1
processChannel(SIGNAL_PIN_1, MEASUREMENT_PERIOD_1, LONG_MEASUREMENT_PERIOD_1, PULSE_TIMEOUT_1,
MIN_FREQUENCY_1, MAX_FREQUENCY_1, DEGREE_PER_HZ_1, LARGE_CHANGE_THRESHOLD_1,
ANGLE_OFFSET_1, CORRECTION_FACTOR_1, lastDisplayedAngle_1, lastMeasurementTime_1, 0); // Row 0 for angle 1

// Process Channel 2
processChannel(SIGNAL_PIN_2, MEASUREMENT_PERIOD_2, LONG_MEASUREMENT_PERIOD_2, PULSE_TIMEOUT_2,
MIN_FREQUENCY_2, MAX_FREQUENCY_2, DEGREE_PER_HZ_2, LARGE_CHANGE_THRESHOLD_2,
ANGLE_OFFSET_2, CORRECTION_FACTOR_2, lastDisplayedAngle_2, lastMeasurementTime_2, 2); // Row 2 for angle 2
}

// Function to process a single channel
void processChannel(int signalPin, unsigned long measurementPeriod, unsigned long longMeasurementPeriod,
unsigned long pulseTimeout, float minFrequency, float maxFrequency, float degreePerHz,
float largeChangeThreshold, float angleOffset, float correctionFactor, float &lastDisplayedAngle,
unsigned long &lastMeasurementTime, int lcdRow) {

unsigned long currentTime = millis();
float totalAngle = 0.0;
int numReadings = 0;

// Collect data for MEASUREMENT_PERIOD
unsigned long measurementStartTime = currentTime;
while (currentTime - measurementStartTime < measurementPeriod) {
float angle = measureAngle(signalPin, pulseTimeout, minFrequency, maxFrequency, degreePerHz);

if (angle == -1.0) {
  delay(1);
  currentTime = millis();
  continue;
}

totalAngle += angle;
numReadings++;
currentTime = millis();

}

float averageAngle = 0.0;
if (numReadings > 0) {
averageAngle = totalAngle / numReadings;
} else {
Serial.println(“No valid readings in the period!”);
return;
}

averageAngle -= angleOffset; // Subtract offset

// Apply correction
averageAngle += averageAngle * correctionFactor;

if (averageAngle < 0) {
averageAngle = 0;
}
if (averageAngle > 180) {
averageAngle = 180;
}

bool displayNow = false;

if (currentTime - lastMeasurementTime >= measurementPeriod) {
if (currentTime - lastMeasurementTime >= longMeasurementPeriod) {
displayNow = true;
lastMeasurementTime = currentTime;
} else if (abs(averageAngle - lastDisplayedAngle) >= largeChangeThreshold) {
displayNow = true;
lastMeasurementTime = currentTime;
}

if (displayNow) {
  lcd.setCursor(0, lcdRow + 1); // Use correct row on LCD
  lcd.print(averageAngle);
  lcd.print(" Degrees     ");

  lastDisplayedAngle = averageAngle;
  Serial.print("Average Angle (Degrees): ");
  Serial.println(averageAngle);
}

}
}`

Вы точно не ошибаетесь с частотой? Какие Ггц ? Откуда такая частота?

Мошт космическое излучение?