ShineLAN-X: Growatt-Präfix aus Ordnername entfernt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
#pragma once
|
||||
|
||||
// ============================================================
|
||||
// Pin-Belegung — Quelle: https://github.com/mwalle/shinelanx-modbus
|
||||
// Gleiche Platine, verifizierte Pins
|
||||
// STM32F103RBT6, LQFP-64
|
||||
// ============================================================
|
||||
|
||||
// ENC28J60 — SPI2 (Hardware-SPI)
|
||||
// LQFP-64: PB12=33, PB13=34, PB14=35, PB15=36, PC6=37, PC8=39
|
||||
#define ETH_CS_PIN PB12 // ENC28J60 /CS (SPI2 NSS)
|
||||
#define ETH_SCK_PIN PB13 // ENC28J60 SCK (SPI2 SCK)
|
||||
#define ETH_MISO_PIN PB14 // ENC28J60 SO (SPI2 MISO)
|
||||
#define ETH_MOSI_PIN PB15 // ENC28J60 SI (SPI2 MOSI)
|
||||
#define ETH_RST_PIN PC8 // ENC28J60 /RESET
|
||||
#define ETH_INT_PIN PC6 // ENC28J60 INT# (optional, polling reicht)
|
||||
|
||||
// LEDs
|
||||
#define LED_DEBUG PC7 // Debug-LED (grün o.ä.)
|
||||
#define LED_RED PB1 // RGB Rot
|
||||
#define LED_GREEN PB0 // RGB Grün
|
||||
#define LED_BLUE PC5 // RGB Blau
|
||||
|
||||
// Taster
|
||||
#define BTN_USER PA3 // User-Taster (low-aktiv)
|
||||
|
||||
// ============================================================
|
||||
// NETZWERK
|
||||
// ============================================================
|
||||
|
||||
// 0 = DHCP, 1 = Statische IP
|
||||
#define USE_DHCP 1
|
||||
|
||||
// Nur relevant wenn USE_DHCP = 0
|
||||
#define STATIC_IP 192,168,2,15
|
||||
#define STATIC_GW 192,168,2,1
|
||||
#define STATIC_SUBNET 255,255,255,0
|
||||
#define STATIC_DNS 192,168,2,1
|
||||
|
||||
// MAC-Adresse — muss im Netzwerk eindeutig sein
|
||||
#define MAC_ADDRESS 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
|
||||
|
||||
// ============================================================
|
||||
// MQTT
|
||||
// ============================================================
|
||||
#define MQTT_BROKER "192.168.1.1"
|
||||
#define MQTT_PORT 1883
|
||||
#define MQTT_USER "mqtt"
|
||||
#define MQTT_PASSWORD "HIER_MQTT_PASSWORT_EINTRAGEN"
|
||||
#define MQTT_CLIENT "growatt-shinelan"
|
||||
|
||||
// ============================================================
|
||||
// MODBUS / WECHSELRICHTER-KOMMUNIKATION
|
||||
// Growatt kommuniziert über USB-CDC (virtueller COM-Port) bei 115200 Baud.
|
||||
// STM32 agiert als USB-Device (CDC), Wechselrichter ist USB-Host.
|
||||
// Physikalisch: PA11=D-, PA12=D+, PA8=USB-Pullup-Steuerpin
|
||||
// Kein RS485, kein DE/RE-Pin nötig.
|
||||
// ============================================================
|
||||
#define MODBUS_BAUD 115200 // Growatt USB-CDC Baudrate
|
||||
#define MODBUS_ADDR 1 // Modbus Slave-Adresse des Wechselrichters
|
||||
|
||||
// ============================================================
|
||||
// GERÄT
|
||||
// ============================================================
|
||||
#define DEVICE_ID "growatt_shinelan"
|
||||
#define DEVICE_NAME "Growatt ShineLAN-X"
|
||||
#define DEVICE_MODEL "ShineLAN-X"
|
||||
#define DEVICE_MFR "Growatt"
|
||||
|
||||
// Abfrageintervall in Millisekunden
|
||||
#define UPDATE_INTERVAL 10000UL
|
||||
@@ -0,0 +1,29 @@
|
||||
#pragma once
|
||||
#include <Arduino.h>
|
||||
#include "config.h"
|
||||
|
||||
// ============================================================
|
||||
// Bitbang-SPI für ENC28J60 auf PC6/PC7/PC8/PC9
|
||||
// ENC28J60 verwendet SPI Mode 0 (CPOL=0, CPHA=0)
|
||||
// ============================================================
|
||||
|
||||
static inline void eth_spi_init() {
|
||||
pinMode(ETH_SCK_PIN, OUTPUT); digitalWrite(ETH_SCK_PIN, LOW);
|
||||
pinMode(ETH_MOSI_PIN, OUTPUT); digitalWrite(ETH_MOSI_PIN, LOW);
|
||||
pinMode(ETH_MISO_PIN, INPUT);
|
||||
pinMode(ETH_CS_PIN, OUTPUT); digitalWrite(ETH_CS_PIN, HIGH);
|
||||
}
|
||||
|
||||
static inline void eth_cs_low() { digitalWrite(ETH_CS_PIN, LOW); }
|
||||
static inline void eth_cs_high() { digitalWrite(ETH_CS_PIN, HIGH); }
|
||||
|
||||
static inline uint8_t eth_spi_transfer(uint8_t out) {
|
||||
uint8_t in = 0;
|
||||
for (int8_t i = 7; i >= 0; i--) {
|
||||
digitalWrite(ETH_MOSI_PIN, (out >> i) & 1);
|
||||
digitalWrite(ETH_SCK_PIN, HIGH);
|
||||
in = (in << 1) | digitalRead(ETH_MISO_PIN);
|
||||
digitalWrite(ETH_SCK_PIN, LOW);
|
||||
}
|
||||
return in;
|
||||
}
|
||||
Reference in New Issue
Block a user