Re: Projekt Stor-Erik, renovering av ångbogserbåt
Postat: 7 mars 2019, 15:57:12
Hur går det med värmeväxlaren om det är väldigt kallt vatten? Finns det inte risk att den fryser?
Svenskt forum för elektroniksnack.
https://elektronikforumet.com/forum/
Kod: Markera allt
#include <SPI.h>
#include <Controllino.h>
char initMessage[] = {0x2f, 0x3f, 0x21, 0x0d, 0x0a};
char setReadoutMode[] = {0x06, 0x30, 0x34, 0x30, 0x0D, 0x0A};
String readBuffer;
void setup() {
// Seriesnöre till dator för debug
Serial.begin(9600);
/* Initialize CONTROLLINO RS485 direction control DE/RE pins and Serial3 */
Controllino_RS485Init(9600);
}
void loop() {
bool isInitialized = 0;
while (!isInitialized) {
Serial.print("Skickar initMessage: ");
Serial.write(initMessage);
Controllino_RS485TxEnable();
Serial3.write(initMessage);//, sizeof(initMessage));
Serial3.flush(); // wait until the trasmission is complete
Controllino_RS485RxEnable();
readBuffer = Serial3.readString();
Serial.print("Svar: ");
Serial.println(readBuffer);
Serial.print("Svar tecken för tecken i HEX: ");
for (int i=0;i<sizeof(readBuffer);i++) {
Serial.print(readBuffer[i], HEX);
Serial.print(' ');
}
Serial.println();
Serial.println();
if (readBuffer == "rätt svar") {
isInitialized = 1;
Serial.println("\nInitierad!");
}
}
while (isInitialized) {
Controllino_RS485TxEnable();
Serial3.write(setReadoutMode);//, sizeof(initMessage));
Serial3.flush(); // wait until the trasmission is complete
Controllino_RS485RxEnable();
readBuffer = Serial3.readString();
Serial.print(readBuffer);
}
}
Kod: Markera allt
Skickar initMessage: /?!
Svar:
Svar tecken för tecken i HEX: 0 0 0 0 0 0
Skickar initMessage: /?!
Svar: ⸮⸮⸮⸮5\⸮⸮⸮-M⸮-D⸮V00⸮⸮0⸮⸮⸮⸮⸮
Svar tecken för tecken i HEX: FFFFFFAF FFFFFFC5 FFFFFFC6 FFFFFFD2 35 5C
Skickar initMessage: /?!
Svar: ⸮
Svar tecken för tecken i HEX: FFFFFF95 0 0 0 0 0
Skickar initMessage: /?!
Svar: ⸮⸮⸮⸮5\⸮⸮⸮-M⸮-D⸮V00⸮⸮0⸮⸮⸮⸮⸮
Svar tecken för tecken i HEX: FFFFFFAF FFFFFFC5 FFFFFFC6 FFFFFFD2 35 5C
Skickar initMessage: /?!
Svar: ⸮
Svar tecken för tecken i HEX: FFFFFF95 0 0 0 0 0
Skickar initMessage: /?!
Svar:
Svar tecken för tecken i HEX: 0 0 0 0 0 0
Skickar initMessage: /?!
Svar: ⸮⸮⸮⸮5\⸮⸮⸮-M⸮-D⸮V00⸮⸮0⸮⸮⸮⸮⸮
Svar tecken för tecken i HEX: FFFFFFAF FFFFFFC5 FFFFFFC6 FFFFFFD2 35 5C
Kod: Markera allt
#include <SPI.h>
#include <Controllino.h>
char initMessage[] = {0x2f, 0x3f, 0x21, 0x0d, 0x0a};
char setReadoutMode[] = {0x06, 0x30, 0x35, 0x30, 0x0D, 0x0A};
String readBuffer;
void setup() {
// Seriesnöre till dator för debug
Serial.begin(9600);
/* Initialize CONTROLLINO RS485 direction control DE/RE pins and Serial3 */
Controllino_RS485Init(9600);
Serial3.begin(9600, SERIAL_7E1); // Controllinos bibliotek stöder inte config-argumentet så det behöver göras här.
}
void loop() {
bool isInitialized = 0;
while (!isInitialized) {
Serial.print("Skickar initMessage: ");
Serial.write(initMessage);
Controllino_RS485TxEnable();
Serial3.write(initMessage);//, sizeof(initMessage));
Serial3.flush(); // wait until the trasmission is complete
Controllino_RS485RxEnable();
readBuffer = Serial3.readString();
Serial.print("Svar: ");
Serial.println(readBuffer);
Serial.print("Svar tecken för tecken i HEX: ");
for (int i=0;i<readBuffer.length();i++) {
Serial.print(0xff & readBuffer[i], HEX);
Serial.print(' ');
}
Serial.println();
Serial.println();
if (readBuffer.startsWith("/EFR5")) {
isInitialized = 1;
Serial.println("\nInitierad!");
}
}
while (isInitialized) {
Controllino_RS485TxEnable();
Serial3.write(setReadoutMode);//, sizeof(initMessage));
Serial3.flush(); // wait until the trasmission is complete
Controllino_RS485RxEnable();
readBuffer = Serial3.readString();
Serial.print(readBuffer);
}
}
Kod: Markera allt
Skickar initMessage: /?!
Svar: /EFR5\EFR-M4-DRV004101222
Svar tecken för tecken i HEX: 2F 45 46 52 35 5C 45 46 52 2D 4D 34 2D 44 52 56 30 30 34 31 30 31 32 32 32 D A
Initierad!
EFR-M4-DRV004101222
1-0:0.0.0*255(GETTONE)
1-0:1.8.0*255(00000.00*kWh)
1-0:2.1.7*255(00000.00*kWh)
1-0:4.1.7*255(00000.00*kWh)
1-0:6.1.7*255(00000.00*kWh)
1-0:21.7.255*255(0000.0015*kW)
1-0:41.7.255*255(0000.0000*kW)
1-0:61.7.255*255(0000.0000*kW)
1-0:1.7.255*255(0000.0000*kW)
1-0:96.5.5*255( )
0-0:96.1.255*255(11402295)
!
:
Kod: Markera allt
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Controllino.h>
#include <CayenneMQTTEthernet.h>
#define DS18B20_PIN 6
#define CAYENNE 1 // used to enable/disable cayenne logging
//#define CAYENNE_PRINT Serial // Comment this out to disable prints and save space
// Cayenne authentication info. This should be obtained from the Cayenne Dashboard.
char username[] = "00f091e0-4053-11e9-b395-f53190c2ab6f";
char password[] = "xxx";
char clientID[] = "8279bbb0-4053-11e9-9622-9b9aeccba453";
// Elmätarens status. 0-4 = Mätarställning, kW på fas 1, 2, 3 och alla faser.
float meterStatus[5]={142525.54, 10.1, 20.2, 30.3, 40.4};
// Saker för att kommunicera med elmätaren
const char initMessage[] = {0x2F, 0x3F, 0x21, 0x0D, 0x0A};
const char setReadoutMode[] = {0x06, 0x30, 0x35, 0x30, 0x0D, 0x0A};
// MAC?: FE-38-85-62-17-19
// Kommer från Cayennes exempelskiss
// Create a Onewire Referenca and assign it to pin 20
OneWire oneWire(DS18B20_PIN);
// declare as sensor reference by passing oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
// The addresses to the sensors are hard coded
const char tempSensors[15]∞ = {{0x28, 0x88, 0x98, 0x28, 0x00, 0x00, 0x80, 0x3C},
{0x28, 0x44, 0xA7, 0x28, 0x00, 0x00, 0x80, 0x35},
{0x28, 0xBC, 0x87, 0x28, 0x00, 0x00, 0x80, 0x1E},
{0x28, 0xEA, 0xA4, 0x28, 0x00, 0x00, 0x80, 0x34},
{0x28, 0x5A, 0xA2, 0x28, 0x00, 0x00, 0x80, 0xAF},
{0x28, 0x7A, 0x91, 0x28, 0x00, 0x00, 0x80, 0xD3},
{0x28, 0x3E, 0xA0, 0x28, 0x00, 0x00, 0x80, 0x33},
{0x28, 0xE1, 0x94, 0x28, 0x00, 0x00, 0x80, 0x48},
{0x28, 0x09, 0x95, 0x28, 0x00, 0x00, 0x80, 0x0D},
{0x28, 0x55, 0xA9, 0x28, 0x00, 0x00, 0x80, 0xFB},
{0x28, 0x83, 0x8A, 0x28, 0x00, 0x00, 0x80, 0x3B},
{0x28, 0x2B, 0x52, 0x01, 0x00, 0x00, 0x80, 0x45},
{0x28, 0xE7, 0x9F, 0x28, 0x00, 0x00, 0x80, 0x8A},
{0x28, 0xDF, 0x92, 0x28, 0x00, 0x00, 0x80, 0x2A},
{0x28, 0xBF, 0x93, 0x28, 0x00, 0x00, 0x80, 0x24}};
const float sensorZeroCalibration[15] = {0.125, 0.250, 0.250, 0.250, 0.125, 0.250, 0.375, 0.500, 0.250, 0.250, 0.375, 0, 0.375, 0, 0.375};
// Dessa kokpunkter mättes med nollpunktskorrigeringen påslagen!
// Kokpunkt vid tillfället 99,44 *C
//const float sensor100Calibration[15] = {99.125, 98.875, 99.375, 98.875, 99.125, 98.875, 98.875, 98.5, 99.375, 99.250, 98.875, 99, 99.25, 97.375, 98.625};
float tempC;
// Startar kommunikation med och läser ställningen på elmätaren
void getMeterStatus() {
int index=0, isInitialized=0;
String readString, readBuffer;
Controllino_RS485Init(9600);
Serial3.begin(9600, SERIAL_7E1); // Controllinos bibliotek stöder inte config-argumentet så det behöver göras här.
Serial.print("i getMeter!");
while (!readBuffer.startsWith("/EFR5")) {
Controllino_RS485TxEnable();
Serial3.write(initMessage);//, sizeof(initMessage));
Serial3.flush(); // wait until the trasmission is complete
Serial.write("Init: "); Serial.write(initMessage); Serial.println();
Controllino_RS485RxEnable();
readBuffer = Serial3.readString();
Serial.println(readBuffer);
for (int i=0;i<readBuffer.length();i++) {
Serial.print(0xff & readBuffer[i], HEX);
Serial.print(' KOMMER HIT? ');
}
}
Controllino_RS485TxEnable();
Serial3.write(setReadoutMode);
Serial3.flush(); // wait until the trasmission is complete
Controllino_RS485RxEnable();
readBuffer = Serial3.readString();
Serial.print(readBuffer);
index = readBuffer.indexOf("1-0:1.8.0*255") + 14;
readString = readBuffer.substring(index,index+8);
meterStatus[0] = readString.toFloat();
index = readBuffer.indexOf("1-0:21.7.255*255") + 17;
readString = readBuffer.substring(index,index+9);
meterStatus[1] = readString.toFloat();
index = readBuffer.indexOf("1-0:41.7.255*255") + 17;
readString = readBuffer.substring(index,index+9);
meterStatus[2] = readString.toFloat();
index = readBuffer.indexOf("1-0:61.7.255*255") + 17;
readString = readBuffer.substring(index,index+9);
meterStatus[3] = readString.toFloat();
index = readBuffer.indexOf("1-0:1.7.255*255") + 16;
readString = readBuffer.substring(index,index+9);
meterStatus[4] = readString.toFloat();
}
void setup(void)
{
Serial.begin(9600);
if(CAYENNE) {Cayenne.begin(username, password, clientID);}
for (int i=0;i<15;i++) {
// set the resolution to 11 bit - Valid values are 9, 10, or 11 bit.
sensors.setResolution(tempSensors[i], 11);
// confirm that we set that resolution by asking the DS18B20 to repeat it back
Serial.print("Sensor Resolution: ");
Serial.println(sensors.getResolution(tempSensors[i]), DEC);
Serial.println();
}
}
void loop(void)
{
while (1) {
// Läs elmätaren via RS485
//getMeterStatus();
if(CAYENNE) {
Cayenne.virtualWrite(15, meterStatus[0], "analog_sensor", "null");
Cayenne.virtualWrite(16, meterStatus[1], "analog_sensor", "null");
Cayenne.virtualWrite(17, meterStatus[2], "analog_sensor", "null");
Cayenne.virtualWrite(18, meterStatus[3], "analog_sensor", "null");
Cayenne.virtualWrite(19, meterStatus[4], "analog_sensor", "null");
}
// Läs tempsensorerna och skicka in på Cayenne
for (int n=0;n<15;n++) {
sensors.requestTemperaturesByAddress(tempSensors[n]); // Send the command to get temperatures
tempC = sensors.getTempC(tempSensors[n]);// - sensorZeroCalibration[n];
Serial.print("Sensor "); Serial.print(n); Serial.print(" :"); Serial.print(tempC, 4); Serial.println(" *C");
if(CAYENNE) {Cayenne.celsiusWrite(n, tempC);}
delay(100);
}
delay(3000);
Serial.println("\n");
}
}