chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Arduino plc和termux esp

丙丁先生的自學(xué)旅程 ? 2025-12-06 06:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1. Arduino PLC 核心操作(命令行/腳本化)

Arduino PLC(如Arduino Industrial 101)可通過arduino-cli實(shí)現(xiàn)命令行編譯/上傳,替代圖形化IDE:

# 安裝arduino-cli(Linux/macOS)
curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh
# 初始化配置
arduino-cli config init
# 安裝PLC核心(以Industrial 101為例)
arduino-cli core install arduino:avr
# 編譯PLC程序(替換為你的 sketch 路徑)
arduino-cli compile --fqbn arduino:avr:industrial101 /path/to/your/sketch
# 上傳到PLC(替換串口名,如/dev/ttyUSB0)
arduino-cli upload -p /dev/ttyUSB0 --fqbn arduino:avr:industrial101 /path/to/your/sketch

2. Termux 操作 ESP32 關(guān)鍵步驟

Termux(安卓終端)中可搭建ESP32開發(fā)環(huán)境,核心命令:

# 安裝依賴
pkg install git python3 py3-pip gcc make libffi openssl
# 安裝esptool(燒錄工具)
pip3 install esptool
# 克隆ESP-IDF(適配ESP32的版本)
git clone --depth 1 --branch v4.4 https://github.com/espressif/esp-idf.git
# 安裝ESP-IDF依賴
cd esp-idf
./install.sh esp32
# 配置環(huán)境變量
. ./export.sh
# 燒錄固件到ESP32(替換串口名/固件路徑,Termux串口通常為/dev/ttyUSB0或/dev/ttyACM0)
esptool.py --port /dev/ttyUSB0 write_flash 0x1000 /path/to/your/esp32_firmware.bin

3. 兩者聯(lián)動(dòng)(PLC ? ESP32)

若需Arduino PLC與ESP32通信,可通過串口/Modbus實(shí)現(xiàn),核心代碼片段(Arduino PLC端):

#include < ModbusRTU.h >
ModbusRTU mb;
void setup() {
  Serial.begin(9600); // 與ESP32串口波特率一致
  mb.begin(&Serial);
  mb.slave(1); // 從機(jī)地址
}
void loop() {
  mb.poll();
  // 讀取ESP32發(fā)送的寄存器數(shù)據(jù)(示例:讀取寄存器0的值)
  uint16_t val = mb.Hreg(0);
  // 控制PLC輸出(示例:根據(jù)值控制數(shù)字輸出)
  digitalWrite(13, val > 0 ? HIGH : LOW);
}

Arduino PLC 與 ESP32(Termux 環(huán)境)Modbus 完整通信腳本

一、核心前提(必做)

  1. 硬件連接:PLC 與 ESP32 用 TTL 串口交叉連接 (PLC TX → ESP32 RX,PLC RX → ESP32 TX,共地 GND);
  2. 環(huán)境準(zhǔn)備:
    • PLC 端:安裝 ModbusRTU 庫(kù)(Arduino IDE 或 arduino-cli 均可);
    • Termux 端:已完成 ESP-IDF 搭建(參考上一輪命令),安裝 modbus_slave 相關(guān)依賴(腳本內(nèi)包含)。

二、1. Arduino PLC 端(Modbus 主機(jī),讀取/控制 ESP32)

#include < ModbusRTU.h >

// 定義Modbus對(duì)象
ModbusRTU mb;

// 定義PLC引腳(根據(jù)實(shí)際型號(hào)調(diào)整,以Industrial 101為例)
const int PLC_OUTPUT_PIN = 13; // PLC數(shù)字輸出引腳
const int PLC_INPUT_PIN = 2;   // PLC數(shù)字輸入引腳

void setup() {
  // 1. 初始化串口(與ESP32波特率、校驗(yàn)位一致)
  Serial.begin(9600, SERIAL_8N1); 
  while (!Serial) {} // 等待串口就緒

  // 2. 初始化Modbus主機(jī)
  mb.begin(&Serial);
  mb.master(); // 配置為Modbus主機(jī)
  mb.setTimeOut(1000); // 通信超時(shí)時(shí)間(1秒)

  // 3. 初始化PLC引腳
  pinMode(PLC_OUTPUT_PIN, OUTPUT);
  pinMode(PLC_INPUT_PIN, INPUT);
}

void loop() {
  uint16_t esp_data[2]; // 存儲(chǔ)從ESP32讀取的數(shù)據(jù)(寄存器0:傳感器值,寄存器1:ESP32狀態(tài))
  uint8_t result;       // Modbus通信結(jié)果

  // 1. 讀取ESP32的2個(gè)保持寄存器(地址0和1,從機(jī)地址1)
  result = mb.readHreg(1, 0, 2, esp_data); 
  if (result == mb.ku8MBSuccess) {
    // 讀取成功:打印ESP32數(shù)據(jù)
    Serial.print("ESP32 傳感器值:");
    Serial.println(esp_data[0]);
    Serial.print("ESP32 狀態(tài):");
    Serial.println(esp_data[1] == 1 ? "正常" : "異常");

    // 2. 根據(jù)ESP32數(shù)據(jù)控制PLC輸出
    if (esp_data[0] > 500) { // 示例:傳感器值大于500時(shí),PLC輸出高電平
      digitalWrite(PLC_OUTPUT_PIN, HIGH);
    } else {
      digitalWrite(PLC_OUTPUT_PIN, LOW);
    }
  } else {
    // 讀取失?。捍蛴″e(cuò)誤代碼
    Serial.print("Modbus讀取失敗,錯(cuò)誤代碼:");
    Serial.println(result);
  }

  // 3. 讀取PLC輸入狀態(tài),發(fā)送給ESP32(寫入ESP32的線圈0)
  bool plc_input_state = digitalRead(PLC_INPUT_PIN);
  result = mb.writeCoil(1, 0, plc_input_state); // 寫入ESP32線圈0(從機(jī)地址1)
  if (result != mb.ku8MBSuccess) {
    Serial.print("Modbus寫入失敗,錯(cuò)誤代碼:");
    Serial.println(result);
  }

  delay(1000); // 通信間隔(1秒,可調(diào)整)
}

三、2. Termux + ESP32 端(Modbus 從機(jī),上傳數(shù)據(jù)/接收控制)

步驟1:創(chuàng)建 ESP32 項(xiàng)目(Termux 命令行操作)

# 1. 進(jìn)入ESP-IDF目錄,加載環(huán)境變量
cd ~/esp-idf
. ./export.sh

# 2. 創(chuàng)建新的ESP32項(xiàng)目(項(xiàng)目名:esp32_modbus_slave)
idf.py create-project esp32_modbus_slave
cd esp32_modbus_slave

# 3. 配置項(xiàng)目(選擇ESP32開發(fā)板,如ESP32-WROOM-32)
idf.py set-target esp32
idf.py menuconfig
# (可選)在menuconfig中設(shè)置串口波特率(默認(rèn)9600,需與PLC一致)
# 路徑:Component config → Modbus → UART Baud Rate → 9600

步驟2:替換項(xiàng)目代碼(main.c)

#include < stdio.h >
#include < string.h >
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/uart.h"
#include "driver/gpio.h"
#include "modbus_slave.h"

// 1. 串口配置(與PLC一致)
#define UART_NUM UART_NUM_0        // ESP32串口0(可替換為UART_NUM_1)
#define BAUD_RATE 9600             // 波特率
#define TX_PIN GPIO_NUM_1          // ESP32 TX引腳(連接PLC RX)
#define RX_PIN GPIO_NUM_3          // ESP32 RX引腳(連接PLC TX)
#define BUF_SIZE (1024)            // 串口緩沖區(qū)大小

// 2. Modbus從機(jī)配置
#define MODBUS_SLAVE_ADDR 1        // 從機(jī)地址(需與PLC主機(jī)一致)
#define REG_HOLDING_START 0        // 保持寄存器起始地址
#define REG_HOLDING_SIZE 2         // 保持寄存器數(shù)量(2個(gè):傳感器值、狀態(tài))
#define COIL_START 0               // 線圈起始地址
#define COIL_SIZE 1                // 線圈數(shù)量(1個(gè):接收PLC輸入狀態(tài))

// 3. 模擬傳感器數(shù)據(jù)(可替換為實(shí)際傳感器讀取代碼)
uint16_t sensor_value = 0;
// 4. Modbus寄存器和線圈存儲(chǔ)區(qū)
uint16_t holding_regs[REG_HOLDING_SIZE] = {0}; // 保持寄存器(供PLC讀?。?/span>
bool coils[COIL_SIZE] = {false};                // 線圈(接收PLC寫入)

// 串口初始化函數(shù)
void uart_init() {
    const uart_config_t uart_config = {
        .baud_rate = BAUD_RATE,
        .data_bits = UART_DATA_8_BITS,
        .parity = UART_PARITY_DISABLE,
        .stop_bits = UART_STOP_BITS_1,
        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
        .source_clk = UART_SCLK_APB,
    };
    // 配置串口參數(shù)
    uart_param_config(UART_NUM, &uart_config);
    // 設(shè)置串口引腳
    uart_set_pin(UART_NUM, TX_PIN, RX_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
    // 安裝串口驅(qū)動(dòng)(中斷模式)
    uart_driver_install(UART_NUM, BUF_SIZE * 2, 0, 0, NULL, 0);
}

// Modbus從機(jī)初始化函數(shù)
void modbus_slave_init() {
    // 1. 初始化Modbus從機(jī)(串口0,從機(jī)地址1)
    modbus_slave_init_port(UART_NUM, MODBUS_SLAVE_ADDR);
    // 2. 注冊(cè)保持寄存器(供PLC讀?。?/span>
    modbus_slave_register_holding_regs(REG_HOLDING_START, REG_HOLDING_SIZE, holding_regs);
    // 3. 注冊(cè)線圈(接收PLC寫入)
    modbus_slave_register_coils(COIL_START, COIL_SIZE, coils);
    // 4. 啟動(dòng)Modbus從機(jī)任務(wù)
    modbus_slave_start_task();
}

// 模擬傳感器數(shù)據(jù)更新任務(wù)
void sensor_update_task(void *pvParameters) {
    while (1) {
        // 模擬傳感器值遞增(0~1000,循環(huán))
        sensor_value = (sensor_value + 10) % 1000;
        // 更新保持寄存器(寄存器0:傳感器值,寄存器1:狀態(tài)1=正常)
        holding_regs[0] = sensor_value;
        holding_regs[1] = 1; // 固定為正常狀態(tài),可替換為實(shí)際狀態(tài)判斷
        vTaskDelay(500 / portTICK_PERIOD_MS); // 500ms更新一次
    }
}

// 讀取PLC寫入的線圈狀態(tài)任務(wù)
void plc_coil_read_task(void *pvParameters) {
    while (1) {
        // 讀取線圈0的狀態(tài)(PLC輸入引腳狀態(tài))
        bool plc_input = coils[0];
        // 打印PLC輸入狀態(tài)
        printf("PLC輸入狀態(tài):%sn", plc_input ? "高電平" : "低電平");
        // (可選)根據(jù)PLC狀態(tài)控制ESP32引腳
        gpio_set_level(GPIO_NUM_2, plc_input ? 1 : 0); // ESP32引腳2輸出對(duì)應(yīng)電平
        vTaskDelay(1000 / portTICK_PERIOD_MS); // 1秒讀取一次
    }
}

void app_main(void) {
    // 1. 初始化GPIO(ESP32引腳2,用于響應(yīng)PLC控制)
    gpio_reset_pin(GPIO_NUM_2);
    gpio_set_direction(GPIO_NUM_2, GPIO_MODE_OUTPUT);

    // 2. 初始化串口和Modbus從機(jī)
    uart_init();
    modbus_slave_init();

    // 3. 創(chuàng)建傳感器更新和PLC線圈讀取任務(wù)
    xTaskCreate(sensor_update_task, "sensor_task", 2048, NULL, 5, NULL);
    xTaskCreate(plc_coil_read_task, "coil_task", 2048, NULL, 5, NULL);
}

步驟3:編譯并燒錄到 ESP32(Termux 命令)

# 1. 編譯項(xiàng)目
idf.py build

# 2. 燒錄固件(替換串口名,Termux中通常為/dev/ttyUSB0或/dev/ttyACM0)
idf.py -p /dev/ttyUSB0 flash monitor
# 燒錄成功后,按Ctrl+]退出monitor,ESP32將自動(dòng)運(yùn)行程序

四、3. 調(diào)試與驗(yàn)證

  1. 硬件上電:先給 PLC 上電,再給 ESP32 上電(避免串口沖擊);
  2. PLC 端:打開串口監(jiān)視器(波特率9600),可看到 ESP32 發(fā)送的傳感器值和狀態(tài);
  3. ESP32(Termux)端:重新運(yùn)行 idf.py -p /dev/ttyUSB0 monitor,可看到 PLC 輸入引腳的狀態(tài);
  4. 交互測(cè)試:
    • 調(diào)整 ESP32 模擬傳感器值(代碼中 sensor_value),觀察 PLC 輸出引腳是否按條件切換;
    • 切換 PLC 輸入引腳狀態(tài),觀察 ESP32 引腳2是否同步響應(yīng),且 Termux 終端打印對(duì)應(yīng)狀態(tài)。

五、常見問題排查

  • 通信失?。簷z查串口接線(交叉連接)、波特率/校驗(yàn)位是否一致、Modbus從機(jī)地址是否匹配;
  • Termux 燒錄失?。捍_認(rèn) ESP32 已進(jìn)入燒錄模式(按住BOOT鍵,再按EN鍵,松開EN鍵后松開BOOT鍵);
  • 數(shù)據(jù)亂碼:檢查串口接線是否松動(dòng),或更換 ESP32 串口(如從UART0改為UART1)。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Arduino
    +關(guān)注

    關(guān)注

    190

    文章

    6523

    瀏覽量

    196473
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    ESP_I2S庫(kù)本身編譯失敗

    版本存在文件缺失問題,升級(jí)到穩(wěn)定版本可直接解決: 卸載現(xiàn)有ESP32開發(fā)板包: 打開Arduino IDE → 點(diǎn)擊「工具」→「開發(fā)板」→「開發(fā)板管理器」; 在搜索框輸入esp32,找到「e
    發(fā)表于 01-22 07:11

    MCU 開發(fā)板大比拼:STM32、ESP32、Arduino、樹莓派誰更強(qiáng)?

    嵌入式開發(fā)板琳瑯滿目,STM32、ESP32、Arduino、RaspberryPi各有特色。新手容易糾結(jié):到底哪塊板適合我的項(xiàng)目?本文整理了一份開發(fā)板對(duì)比速查表,幫你快速理清思路。一、STM32
    的頭像 發(fā)表于 01-09 19:03 ?529次閱讀
    MCU 開發(fā)板大比拼:STM32、<b class='flag-5'>ESP</b>32、<b class='flag-5'>Arduino</b>、樹莓派誰更強(qiáng)?

    Termux環(huán)境下實(shí)現(xiàn)康威生命游戲

    你想要在Termux環(huán)境下實(shí)現(xiàn)康威生命游戲,并專門展示經(jīng)典的“滑翔機(jī)”模式,構(gòu)建一個(gè)能持續(xù)運(yùn)行的二維世界,同時(shí)需要完整的程序代碼和調(diào)試說明。 一、實(shí)現(xiàn)思路康威生命游戲的核心是遵循4條規(guī)則:1. 活
    發(fā)表于 12-21 18:36

    termux wifi 另一臺(tái)手機(jī) 對(duì)話框`405 Not Allowed`錯(cuò)誤

    請(qǐng)求(無需修改服務(wù)端) 修改 Termux 的 send_msg.sh 腳本,將 POST 改為 GET 方式傳參: # 替換原 POST 命令 curl -G -d \"content
    發(fā)表于 12-18 08:35

    Termux手機(jī)攝像頭采集圖像/視頻流 部署 YOLO 模型推理

    Termux手機(jī)攝像頭采集圖像/視頻流 部署 YOLO 模型推理
    的頭像 發(fā)表于 12-14 07:26 ?2526次閱讀

    Termux中調(diào)試圣誕樹Python代碼

    Termux中調(diào)試Python代碼(以圣誕樹立例)非常簡(jiǎn)單,核心分為環(huán)境準(zhǔn)備、代碼編寫、運(yùn)行調(diào)試三個(gè)步驟,下面一步步教你操作: 一、環(huán)境準(zhǔn)備(首次使用需做) Termux默認(rèn)可能沒有Python
    發(fā)表于 12-09 09:02

    ESP8266和ESP32開發(fā)板常見的2種下載方式

    ESP8266全I(xiàn)O口引出,直接下載無需復(fù)位! ESP32功能框圖 基于arduinoESP32/ESP8266開發(fā)環(huán)境搭建 1.在
    發(fā)表于 10-24 18:04

    使用 LinkBoy 將程序?qū)С鰹?C 語言代碼并燒錄至 Arduino ESP32 開發(fā)板

    以下是使用 LinkBoy 將程序?qū)С鰹?C 語言代碼并燒錄至 Arduino ESP32 開發(fā)板的詳細(xì)步驟指南: 一、準(zhǔn)備工作 ? 硬件需求: 項(xiàng)目 要求 開發(fā)板 Arduino ESP
    發(fā)表于 10-16 12:41

    如何在 NuMaker-IoT-M467 板上使用 Arduino IDE 控制 Wi-Fi 模塊?

    在NuMaker開發(fā)板上,有一個(gè)ESP-12F Wi-Fi模塊;但是,Arduino IDE 中的 NuMaker UNO 包不提供該模塊的相關(guān)控制。如果您希望在 Arduino IDE 中控制此模塊,您應(yīng)該如何進(jìn)行?
    發(fā)表于 09-04 08:28

    termux調(diào)試python猜數(shù)字游戲

    termux做一個(gè)猜數(shù)字游戲 下面是在Termux中創(chuàng)建猜數(shù)字游戲的步驟及完整實(shí)現(xiàn)方案,結(jié)合Python實(shí)現(xiàn)(最適配Termux環(huán)境): ? 一、環(huán)境準(zhǔn)備(Termux基礎(chǔ)
    發(fā)表于 08-29 17:15

    termux輸出Hello termux

    ~ $ nano hello.py ~ $ python hello.py File \"/data/data/com.termux/files/home/hello.py\"
    發(fā)表于 08-29 12:16

    termux如何搭建python游戲

    termux如何搭建python游戲 Termux搭建Python游戲開發(fā)環(huán)境的完整指南 一、Termux基礎(chǔ)環(huán)境準(zhǔn)備 Termux是一款無需root即可在安卓設(shè)備上運(yùn)行的L
    發(fā)表于 08-29 07:06

    樂鑫代理商飛??萍?b class='flag-5'>ESP32 開發(fā)平臺(tái)對(duì)比:ESP-IDF VS Arduino

    Arduino
    深圳市飛??萍加邢薰?
    發(fā)布于 :2025年07月08日 14:36:27

    ESP32-CAM帶OV2640攝像頭視頻顯示

    本文介紹了如何在Arduino IDE上開發(fā)實(shí)現(xiàn)ESP32-CAM模塊獲取實(shí)時(shí)圖像視頻
    的頭像 發(fā)表于 05-23 10:47 ?1527次閱讀
    <b class='flag-5'>ESP</b>32-CAM帶OV2640攝像頭視頻顯示

    ESP32S3 Arduino開發(fā)指南》第二章 Arduino基礎(chǔ)知識(shí)

    周邊資料,其中包括社區(qū)、驅(qū)動(dòng)庫(kù)以及示例代碼等,如下圖2.1.1所示: 圖2.1.1 Arduino生態(tài)圖 現(xiàn)今,Arduino開發(fā)板有很多,正點(diǎn)原子ESP32-S3開發(fā)板也是屬于Arduino
    發(fā)表于 05-13 09:28