Hallo,
ch wollte hier mal im neuen Beitrag das fertige Projekt vorstellen.
Bei diesem wurde mir im Arduino Forum geholfen.
In diesem Projekt wollte ich quasi die Beleuchtung steuern über
IP-Symcon. Dabei aber auch Sensorwerte zu dem Server übermitteln.
Einen Langzeittest habe ich leider noch nicht machen können.
Arduino fadet hoch und runter, von IPS kommen nur gewünschte Werte.
Da ist skripten dafür nicht mehr notwendig!
Hoffe das hilft jemanden auch weiter.
#include <SPI.h>
#include <Ethernet.h>
#include "Mudbus.h"
// getestet mit Mega2560
const byte ausgaenge[] = {2, 3, 4, 5, 6, 7, 8, 9, 45, 11, 12, 13};
const byte PWM = sizeof(ausgaenge);
const byte R[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; // Indexwerte fuer Mb.R[]
int8_t fadeAmount[PWM]; // how many points to fade the LED by
unsigned long currentTime;
unsigned long loopTime;
int brightness[PWM], altModbuswert[PWM], aktModbuswert[PWM];
int sensorwert; // LM35 Temperatur auslesen.
int temperatur = 0; //Unter d
Mudbus Mb;
//Function codes 1(read coils), 3(read registers), 5(write coil), 6(write register)
//signed int Mb.R[0 to 125] and bool Mb.C[0 to 128] MB_N_R MB_N_C
//Port 502 (defined in Mudbus.h) MB_PORT
void setup()
{
Serial.begin(9600);
Serial.println(F("Programmstart"));
for (byte ausgang = 0; ausgang < PWM; ausgang++)
{
fadeAmount[ausgang] = 5;
brightness[ausgang] = 255; // Anfangswert "aus"
altModbuswert[ausgang] = 255; // Anfangswert "aus"
aktModbuswert[ausgang] = 255; // Anfangswert "aus"
}
currentTime = millis();
loopTime = currentTime;
uint8_t mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x51, 0x06 };
uint8_t ip[] = { 192, 168, 178, 70 };
uint8_t gateway[] = { 192, 168, 178, 1 };
uint8_t subnet[] = { 255, 255, 255, 0 };
Ethernet.begin(mac, ip, gateway, subnet);
//PWM Frequenz
//0×01 1 31.374 KHz
//0×02 8 3.921 Khz
//0×03 64 490.1 Hz // default
//0×04 256 122.5 Hz
//0×05 1024 30.63 Hz
//http://playground.arduino.cc/Main/TimerPWMCheatsheet
TCCR1A = (TCCR1A & 0xF8) | 0x01;
TCCR0A = (TCCR0A & 0xF8) | 0x01;
TCCR0B = (TCCR0B & 0xF8) | 0x01;
TCCR2B = (TCCR2B & 0xF8) | 0x01;
}
void loop()
{
Mb.Run();
currentTime = millis();
//PWM Ausgänge:
for (byte ausgang = 0; ausgang < PWM; ausgang++)
{
altModbuswert[ausgang] = aktModbuswert[ausgang];
aktModbuswert[ausgang] = Mb.R[R[ausgang]];
if (altModbuswert[ausgang] != aktModbuswert[ausgang])
{
if (brightness[ausgang] < aktModbuswert[ausgang]) {
fadeAmount[ausgang] = 5;
} else {
fadeAmount[ausgang] = -5;
}
}
}
if (currentTime - loopTime >= 1000) { // 1,5 Sekunden scheint mir recht lange zu sein
loopTime = currentTime; // Updates loopTime
for (byte ausgang = 0; ausgang < PWM; ausgang++)
{
if ((brightness[ausgang] < aktModbuswert[ausgang] && fadeAmount[ausgang] > 0) || (brightness[ausgang] > aktModbuswert[ausgang] && fadeAmount[ausgang] < 0)) {
brightness[ausgang] += fadeAmount[ausgang];
analogWrite(ausgaenge[ausgang], brightness[ausgang]);
}
//Serial.println();
}
}
// Digitale Eingänge herauslesen und zu Modbus übergeben:
//Pin31
Mb.R[14] = digitalRead(31);
//Pin33
Mb.R[15] = digitalRead(33);
//Pin35
Mb.R[16] = digitalRead(35);
//Pin37
Mb.R[17] = digitalRead(37);
//Pin39
Mb.R[18] = digitalRead(39);
//Pin41
Mb.R[19] = digitalRead(41);
//Pin43
Mb.R[20] = digitalRead(43);
//Pin47
Mb.R[21] = digitalRead(47);
//Pin49
Mb.R[22] = digitalRead(49);
//Pin53
Mb.R[23] = digitalRead(53);
// Analoge Eingänge herauslesen und zu Modbus übergeben:
//Pin Analog 0
Mb.R[24] = analogRead(0);
//Pin Analog 1
Mb.R[25] = analogRead(1);
//Pin Analog 2
Mb.R[26] = analogRead(2);
//Pin Analog 3
sensorwert = analogRead(3); // LM35 am Pin A3 12V Netzteil
temperatur = map(sensorwert, 0, 307, 0, 150);
Mb.R[27] = temperatur;
//Pin Analog 4
sensorwert = analogRead(4); // LM35 am Pin A4 Platine Mega - Modbus
temperatur = map(sensorwert, 0, 307, 0, 150);
Mb.R[28] = temperatur;
}
Gruß
MegaModbusFade.rar (1.44 KB)
mudbus.zip (43.9 KB)