Rasberry PI PICO (RP2040) продолжение темы

Что то меня последнее время ходить по внешним ссылкам напрягает. Вот вчера письмо из налоговой пришло с внешней ссылкой а там…

это не внешняя, это внутренняя, потому так и выразился, что ровно постом выше ТСу уже подсказал )))
Так “письма с налоговой” надо смотреть на Госуслугах только )))
ЗЫ я любопытный смотрю служебную информацию ещё, если не в лом

Я прям так и сделал :rofl:

Спасибо) походу у меня одна и Пико убитая и возможно она мне Лору тогда и ушатала или я все ушатал.
Подключил к этой пике max485 и тоже не работает , хотя на уно все работает… Возможно пины опять не те , завтра проверю еще раз

нет времени гуглить, а туда засовывать пингвина еще не научились ?
может будет полезно

Снова нужна помощь :grinning:

Данный скетч работает на уно

#include <ModbusMaster.h>
#include <SoftwareSerial.h>

// Пины для MAX485
#define MAX485_DE  4
#define MAX485_RE  5
#define RX_PIN 2
#define TX_PIN 3

// Создаем объект ModbusMaster
ModbusMaster node;

// Настройка SoftwareSerial для RS-485 связи
SoftwareSerial rs485Serial(RX_PIN, TX_PIN);

// Адреса регистров
const uint16_t concentration_address = 0x00; // Адрес концентрации
const uint16_t threshold1_address = 0x02;    // Адрес порога 1
const uint16_t threshold2_address = 0x04;    // Адрес порога 2

// Функции для отображения концентрации и порогов

void displayConcentration(uint16_t registers[]) {
    if (registers == nullptr) {
        Serial.println("Недостаточно данных для отображения концентрации");
        return;
    }

    uint8_t byte1 = (registers[0] >> 8) & 0xFF;
    uint8_t byte2 = registers[0] & 0xFF;
    uint8_t byte3 = (registers[1] >> 8) & 0xFF;
    uint8_t byte4 = registers[1] & 0xFF;

    bool sign_bit = (byte1 >> 7) & 0x01;
    uint8_t comma_position = byte1 & 0x07;

    int32_t integer_part = (int32_t)byte2 * 10000L + (int32_t)byte3 * 10L + (byte4 >> 4);
    int32_t decimal_part = (byte4 & 0x0F) * 100;

    double value = integer_part + decimal_part / 10000.0;
    value = sign_bit ? -value : value;

    double divisor = 1.0;
    for (uint8_t i = 0; i < comma_position; i++) {
        divisor *= 10.0;
    }
    value /= divisor;

    value = round(value * 100.0) / 100.0;

    Serial.print("Концентрация: ");
    Serial.println(value, 2);
}

void displayThreshold(uint16_t threshold, const char* thresholdName) {
    Serial.print(thresholdName);
    Serial.print(" - ");
    Serial.println(threshold & 0xFF, HEX);  // Выводим только младший байт
}

// Остальной код остаётся без изменений

void preTransmission() {
    digitalWrite(MAX485_RE, HIGH);  
    digitalWrite(MAX485_DE, HIGH);
}

void postTransmission() {
    digitalWrite(MAX485_RE, LOW);   
    digitalWrite(MAX485_DE, LOW);
}

void setup() {
    Serial.begin(9600);
    rs485Serial.begin(9600);
    pinMode(MAX485_DE, OUTPUT);
    pinMode(MAX485_RE, OUTPUT);
    digitalWrite(MAX485_RE, LOW);  
    digitalWrite(MAX485_DE, LOW);   

    node.begin(1, rs485Serial);   
    node.preTransmission(preTransmission);
    node.postTransmission(postTransmission);
}

void loop() {
    uint8_t result;
    uint16_t data[2];

    result = node.readHoldingRegisters(concentration_address, 2);
    if (result == node.ku8MBSuccess) {
        data[0] = node.getResponseBuffer(0);
        data[1] = node.getResponseBuffer(1);

        Serial.println("Измеренное значение концентрации:");
        displayConcentration(data);
    } else {
        Serial.print("Ошибка чтения концентрации. Код ошибки: ");
        Serial.println(result, HEX);
    }

    result = node.readHoldingRegisters(threshold1_address, 1);
    if (result == node.ku8MBSuccess) {
        uint16_t threshold1 = node.getResponseBuffer(0);
        displayThreshold(threshold1, "Порог 1");
    } else {
        Serial.print("Ошибка чтения первого порога. Код ошибки: ");
        Serial.println(result, HEX);
    }

    result = node.readHoldingRegisters(threshold2_address, 1);
    if (result == node.ku8MBSuccess) {
        uint16_t threshold2 = node.getResponseBuffer(0);
        displayThreshold(threshold2, "Порог 2");
    } else {
        Serial.print("Ошибка чтения второго порога. Код ошибки: ");
        Serial.println(result, HEX);
    }

    delay(3000);  
}

Беру обычную зеленую pi pico меняю лишь пины на

// Пины для MAX485
#define MAX485_DE 12
#define MAX485_RE 12
#define RX_PIN 9
#define TX_PIN 8

и ничего не работает

Ошибка чтения концентрации. Код ошибки: E0
Ошибка чтения первого порога. Код ошибки: E0
Ошибка чтения второго порога. Код ошибки: E0

Так же у меня на этой pico сейчас припаяна Лора если скетч записать на пинах

#define ss 7
#define rst 17
#define dio0 20

Она работает.

DE RE один и тот же пин?

Да, в статье так же делают, но на уно раздельные у меня были

Может опечатка в статье?

Вроде нет)

там правда скетч другой

#include <Arduino.h>
UART Serial2(8, 9, 0, 0);  //tx rx
#define rs485_control_pin 12
void setup() {
  Serial.begin(9600);
  Serial2.begin(9600);
  pinMode(rs485_control_pin,OUTPUT);
  digitalWrite(rs485_control_pin,HIGH);
}

void loop() {
  digitalWrite(rs485_control_pin,HIGH);
  if(Serial.available() > 0){
    int LED_CONTROL = Serial.read();

    switch (LED_CONTROL){
      case '1':
      Serial2.println("1");
      Serial.print("LED ON");
      delay(100);
      break;

      case '0':
      Serial2.println("0");
      Serial.print("LED OFF");
      delay(100);
      break;

      default:
      Serial.println(" ");
      break;
  }
  }
  digitalWrite(rs485_control_pin,LOW);
  if(Serial2.available()>0){
    Serial.println(Serial2.readString());
  }
  delay(100);
}

Он кстати тоже ошибку при компиляции дает

sketch_oct23a.ino:2:1: error: ‘UART’ does not name a type
2 | UART Serial2(8, 9, 0, 0); //tx rx
| ^~~~

exit status 1

Compilation error: ‘UART’ does not name a type

Ps. у меня второе подключение не арудине, а сразу на газоанализатор к А В

Попробуйте вместо UART поставить HardwareSerial

тоже ошибка при компиляции ‘arduino::HardwareSerial Serial2’
2 | HardwareSerial Serial2(8, 9, 0, 0); //tx rx
| ^~~~~~~
In file included from C:\Users\roman\AppData\Local\Arduino15\packages\rp2040\hardware\rp2040\4.1.1\cores\rp2040/Arduino.h:128,
from C:\Users\roman\OneDrive\Изображения\sketch_oct23a\sketch_oct23a.ino:1:
C:\Users\roman\AppData\Local\Arduino15\packages\rp2040\hardware\rp2040\4.1.1\cores\rp2040/SerialUART.h:121:19: note: previous declaration as ‘SerialUART Serial2’
121 | extern SerialUART Serial2; // HW UART 1
| ^~~~~~~

exit status 1

Compilation error: conflicting declaration ‘arduino::HardwareSerial Serial2’

Ну вот, подсказывают же, что Serial2 уже объявлен, и он имеет тип SerialUART

1 лайк

it means that Serial2 has been declared already, so you can use it without a type, just Serial2

Почему у него в примере скетч не вызывает ошибок?)) все один в один и плата и скетч

А вы какой аддон для Расбери в ИДЕ установили?

Установил Raspberry Pi Pico , сейчас повторюсь у меня обычная pi pico зеленая)
Единственное , что с другого репозитория , а в статье советуют выбирать по пути Mbed OS RP2040 boards.
Спасибо, скорей всего в этом и проблема. Уже в понедельник проверю.

Нет, в статье как раз советуют другую