Re: Optoingångar
Postat: 12 januari 2022, 12:45:56
OK, då lär högre spänning bara kunde ske vid sabortage - och då är allt möjligt.
Svenskt forum för elektroniksnack.
https://elektronikforumet.com/forum/
Kod: Markera allt
#include <Modbusino.h> //Modbusservern - OBS! Hackat bibliotek, Modbusino.cpp Sök&Ersätt Serial. -> Serial3.
#include "DHT.h" //DHT bibliotek för läsning givare
#include <TimedAction.h> //För att köra funktioner vid vissa intervall, inte i loop-fart
#include <LiquidCrystal.h>//Displaybibliotek
const int rs = 13, en = 12, d4 = 11, d5 = 10, d6 = 9, d7 = 8; //Definiera displaypinnar
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);//Definiera displaypinnar
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
ModbusinoSlave modbusino_slave(100); // Sätt upp modbus på ID 100
DHT dht1(4, DHTTYPE);//DHT1 på pin 4
DHT dht2(3, DHTTYPE);//DHT2 på pin 3
DHT dht3(2, DHTTYPE);//DHT3 på pin 2
float h1, h2, h3, t1, t2, t3, dp1, dp2, dp3; //humidity, temp, dewpoint
uint16_t ih1, ih2, ih3, it1, it2, it3, idp1, idp2, idp3; //Som ovan, men sen i x10 för modbus
uint16_t Holdingreg[15]; //Antal register
uint16_t DigIn1=0, DigIn2=0; //Två 16bitars för status ingångar
String sLine1, sLine2, sLine3, sLine4; //För Displayens rader
byte bState; // Ingången status
//** Läser av DHT fukt och temp. Beräknar daggpunkt. Lägg i INTs x 10 för modbus
void ReadSensors() {
h1 = dht1.readHumidity();
h2 = dht2.readHumidity();
h3 = dht3.readHumidity();
t1 = dht1.readTemperature();
t2 = dht2.readTemperature();
t3 = dht3.readTemperature();
dp1 = calcDewpoint(h1, t1); dp2 = calcDewpoint(h2, t2); dp3 = calcDewpoint(h3, t3);
ih1 = h1 * 10; ih2 = h2 * 10; ih3 = h3 * 10;
it1 = t1 * 10; it2 = t2 * 10; it3 = t3 * 10;
idp1 = dp1 * 10; idp2 = dp2 * 10; idp3 = dp3 * 10;
}
//** Kod till calcDewpoint kopierad rakt av från nätet, enheter °C och RH%
float calcDewpoint(float humi, float temp) {
float k;
k = log(humi/100) + (17.62 * temp) / (243.12 + temp);
return 243.12 * k / (17.62 - k);
}
TimedAction ReadSensorsThread = TimedAction(2000,ReadSensors);//** Kör ReadSensors var 2 sekunder
TimedAction UpdateDispThread = TimedAction(1000,UpdateDisp);//** Kör UpdateDisp var 1 sekunder
void setup() {
modbusino_slave.setup(19200); //Kör modbus i 19200bps
dht1.begin();
dht2.begin();
dht3.begin();
lcd.begin(20, 4);
// Input 22-53 som 32st digitala in
for (int i = 22; i <= 53; i++) {
pinMode(i, INPUT_PULLUP); //input
}
}
void loop() {
ReadSensorsThread.check(); //Kollar om sensors ska läsas
UpdateDispThread.check(); //Kollar om display ska uppdateras
Holdingreg[1] = it1; Holdingreg[2] = it2; Holdingreg[3] = it3; //Stoppa ner temp
Holdingreg[4] = ih1; Holdingreg[5] = ih2; Holdingreg[6] = ih3; //Stoppa ner fukt
Holdingreg[7] = idp1; Holdingreg[8] = idp2; Holdingreg[9] = idp3; //Stoppa ner daggpunkt
Holdingreg[11] = DigIn1; Holdingreg[12] = DigIn2; //Stoppa ner inputstatus som 16bit int
modbusino_slave.loop(Holdingreg, 15); //Skriv ner värden
ReadInputs(); //Läs inputs
}
void ReadInputs() {
for (int scan = 22; scan <= 53; scan++) { //Inputs på DI 22 till 52 = 32st
bState = digitalRead(scan);
if (scan < 38) { bitWrite(DigIn1, scan-22, bState); }; //DI 22 till 37 = INT DigIn1
if (scan > 37) { bitWrite(DigIn2, scan-38, bState); }; //DI 38 till 52 = INT DigIn2
}
}
void UpdateDisp() {
sLine1 = "";sLine2 = "";sLine3 = "";sLine4 = ""; //Töm strängarna
for (int scan1 = 0; scan1 <=15; scan1++) {
sLine1 = sLine1 + bitRead(DigIn1, scan1); //Maska ut bitarna ur inten, bygg på strängen
sLine2 = sLine2 + bitRead(DigIn2, scan1); //Maska ut bitarna ur inten, bygg på strängen
}
sLine3 = "Temp:" + String(t1,1) + " " + String(t2,1) + " " + String(t3,1) + " ";
sLine4 = "Fukt:" + String(h1,1) + " " + String(h2,1) + " " + String(h3,1) + " ";
lcd.setCursor(0, 0); lcd.print(sLine1);
lcd.setCursor(0, 1); lcd.print(sLine2);
lcd.setCursor(0, 2); lcd.print(sLine3);
lcd.setCursor(0, 3); lcd.print(sLine4);
}
Kod: Markera allt
#include <Modbusino.h> //Modbusservern - OBS! Hackat bibliotek, Modbusino.cpp Sök&Ersätt Serial. -> Serial3.
#include "DHT.h" //DHT bibliotek för läsning givare
#include <TimedAction.h> //För att köra funktioner vid vissa intervall, inte i loop-fart
#include <LiquidCrystal.h>//Displaybibliotek
const int rs = 13, en = 12, d4 = 11, d5 = 10, d6 = 9, d7 = 8; //Definiera displaypinnar
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);//Definiera displaypinnar
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
ModbusinoSlave modbusino_slave(100); // Sätt upp modbus på ID 100
DHT dht1(4, DHTTYPE);//DHT1 på pin 4
DHT dht2(3, DHTTYPE);//DHT2 på pin 3
DHT dht3(2, DHTTYPE);//DHT3 på pin 2
float h1, h2, h3, t1, t2, t3, dp1, dp2, dp3; //humidity, temp, dewpoint
uint16_t ih1, ih2, ih3, it1, it2, it3, idp1, idp2, idp3; //Som ovan, men sen i x10 för modbus
uint16_t Holdingreg[15]; //Antal register
uint16_t DigIn1 = 0, DigIn2 = 0; //Två 16bitars för status ingångar
String sLine1, sLine2, sLine3, sLine4; //För Displayens rader
int ctrl1 = 50, ctrl2 = 48, ctrl3 = 52; //Kontrollpinne I/O-moduler
int svar1 = 40; //Modul 1 låg 0-7
int svar2 = 42; //Modul 1 hög 8-15
int svar3 = 44; //Modul 2 låg 0-7
int svar4 = 46; //Modul 2 hög 8-15
bool ioA[16], ioB[16]; //I/O-modulers inputstatus
//** Läser av DHT fukt och temp. Beräknar daggpunkt. Lägg i INTs x 10 för modbus
void ReadSensors() {
h1 = dht1.readHumidity();
h2 = dht2.readHumidity();
h3 = dht3.readHumidity();
t1 = dht1.readTemperature();
t2 = dht2.readTemperature();
t3 = dht3.readTemperature();
dp1 = calcDewpoint(h1, t1); dp2 = calcDewpoint(h2, t2); dp3 = calcDewpoint(h3, t3);
ih1 = h1 * 10; ih2 = h2 * 10; ih3 = h3 * 10;
it1 = t1 * 10; it2 = t2 * 10; it3 = t3 * 10;
idp1 = dp1 * 10; idp2 = dp2 * 10; idp3 = dp3 * 10;
}
//** Kod till calcDewpoint kopierad rakt av från nätet, enheter °C och RH%
float calcDewpoint(float humi, float temp) {
float k;
k = log(humi / 100) + (17.62 * temp) / (243.12 + temp);
return 243.12 * k / (17.62 - k);
}
TimedAction ReadSensorsThread = TimedAction(2000, ReadSensors); //** Kör ReadSensors var 2 sekunder
TimedAction UpdateDispThread = TimedAction(1000, UpdateDisp); //** Kör UpdateDisp var 1 sekunder
void setup() {
modbusino_slave.setup(19200); //Kör modbus i 19200bps
dht1.begin();
dht2.begin();
dht3.begin();
lcd.begin(20, 4);
pinMode(ctrl1, OUTPUT); pinMode(ctrl2, OUTPUT); pinMode(ctrl3, OUTPUT);
pinMode(svar1, INPUT); pinMode(svar2, INPUT); pinMode(svar3, INPUT); pinMode(svar4, INPUT);
}
void loop() {
ReadSensorsThread.check(); //Kollar om sensors ska läsas
UpdateDispThread.check(); //Kollar om display ska uppdateras
Holdingreg[1] = it1; Holdingreg[2] = it2; Holdingreg[3] = it3; //Stoppa ner temp
Holdingreg[4] = ih1; Holdingreg[5] = ih2; Holdingreg[6] = ih3; //Stoppa ner fukt
Holdingreg[7] = idp1; Holdingreg[8] = idp2; Holdingreg[9] = idp3; //Stoppa ner daggpunkt
Holdingreg[11] = DigIn1; Holdingreg[12] = DigIn2; //Stoppa ner inputstatus som 16bit int
modbusino_slave.loop(Holdingreg, 15); //Skriv ner värden
ReadInputs(); //Läs inputs
}
void ReadInputs() {
for (int i = 0; i <= 7; i++) {
controlNodes(i); //Sätt 3 bitar för läsning
readNodes(i); //Läs av status på ingångar
}
for (int scan = 0; scan <= 15; scan++) {
bitWrite(DigIn1, scan, ioA[scan]); //Sätt bit i register efter aktiv ingång
bitWrite(DigIn2, scan, ioB[scan]); //Sätt bit i register efter aktiv ingång
}
}
void controlNodes(int decin) {
digitalWrite(ctrl1, bitRead(decin, 2));
digitalWrite(ctrl2, bitRead(decin, 1));
digitalWrite(ctrl3, bitRead(decin, 0));
}
void readNodes(int nr) {
int out1 = digitalRead(svar1); //Modul 1 låg 0-7
int out2 = digitalRead(svar2); //Modul 1 hög 8-15
int out3 = digitalRead(svar3); //Modul 2 låg 0-7
int out4 = digitalRead(svar4); //Modul 2 hög 8-15
if (out1 == 0) { ioA[nr] = 1; } else { ioA[nr] = 0; }
if (out2 == 0) { ioA[nr + 8] = 1; } else { ioA[nr + 8] = 0; }
if (out3 == 0) { ioB[nr] = 1; } else { ioB[nr] = 0; }
if (out4 == 0) { ioB[nr + 8] = 1; } else { ioB[nr + 8] = 0; }
}
void UpdateDisp() {
sLine1 = ""; sLine2 = ""; sLine3 = ""; sLine4 = ""; //Töm strängarna
for (int scan1 = 0; scan1 <= 15; scan1++) {
sLine1 = sLine1 + bitRead(DigIn1, scan1); //Maska ut bitarna ur inten, bygg på strängen
sLine2 = sLine2 + bitRead(DigIn2, scan1); //Maska ut bitarna ur inten, bygg på strängen
}
sLine3 = "Temp:" + String(t1, 1) + " " + String(t2, 1) + " " + String(t3, 1) + " ";
sLine4 = "Fukt:" + String(h1, 1) + " " + String(h2, 1) + " " + String(h3, 1) + " ";
lcd.setCursor(0, 0); lcd.print(sLine1);
lcd.setCursor(0, 1); lcd.print(sLine2);
lcd.setCursor(0, 2); lcd.print(sLine3);
lcd.setCursor(0, 3); lcd.print(sLine4);
}