Shield geschikt voor 4 x PT1000 (RTD), 3 x DS18B20 temperatuursensoren, 1 counter of aan/uit detectie ingang en 8 relais besturings uitgangen (8 x darlington opto couplers met open collector uitgang).
Geschikt voor het besturen van zonneboilers, houtkachels en verwamingsregelingen. Ook geschikt voor energiemetingen met zonmon.com.
Inhoud:
- 1 x Econo shield, gemaakt en getest
- 8 x soldeer/krimp stekkertje voor sensoraansluiting
Levertijd 2 weken, wordt op bestelling gemaakt en niet op zicht geleverd.
De prijs is inclusief verzendkosten!
De Arduino hoeft niet zelf de sensorbesturing te doen, 3 x ATMEL TINY85 doen het zware werk. De Arduino hoeft alleen maar het resultaat op te vragen. De Arduino hoeft ook nergens op te wachten wat het maken van applicaties een stuk eenvoudiger maakt, zie voorbeeld sketch waarbij elke 3 seconden een verzoek voor sensorwaarden wordt gemaakt die dan gebufferd asynchroon verwerkt worden.
Elke sensor heeft zijn eigen ingang, er is dan ook geen ingewikkelde procedure nodig om b.v. de verschillende DS18B20's te identificeren, gewoon inpluggen en werken.
/*
Econo Arduino controller 8 inputs channels and 8 output channels
- 4 x PT1000 temperature sensor inputs
- 3 x DS18B20 temperature sensor inputs
- 1 x counter input
- 8 x relay output
*/
#include
#include
// Pin 9 has a LED (L9) connected on Arduino ethernet boards.
// L9 will flash slowly when active
// pin 3, is the input from the Tiny85 rs232 inverted output and is used for reading the data from the Tiny85
// pin 2 is used to activate the Tiny85 to send the sensor data
int led = 9;
int select_Tiny = 2; // the select port for the tiny85
int rx=3; // rs232 receive port for Tiny85 data
int tx=99; // non existing port, we do not need to transmit over the rs232 port to the Tiny85
int looptime=1; // 5 seconds
int SecCounter = 0;
int mSecCounter=0;
String rxBuffer = "";
char c;
boolean Tselect = false;
int SelectmSec = 0;
int relaypointer = 0;
//==============================sensor variables=============================================
float t1 = 0; // PT1000 sensor -20ºC to 260ºC, average is calcualted between measurements
float t2 = 0; // PT1000 sensor -20ºC to 260ºC, average is calcualted between measurements
float t3 = 0; // PT1000 sensor -20ºC to 260ºC, average is calcualted between measurements
float t4 = 0; // PT1000 sensor -20ºC to 260ºC, average is calcualted between data requests to Tiny85
float t5 = 0; // DS18B20 sensor -50ºC to 125ºC, last value is provided at data request to Tiny85
float t6 = 0; // DS18B20 sensor -50ºC to 125ºC, last value is provided at data request to Tiny85
float t7 = 0; // DS18B20 sensor -50ºC to 125ºC, last value is provided at data request to Tiny85
int c1 = 0; // Counter input e.g. flow meter or SO output from elektricity meter, counter value is reset after reading
boolean s1 = true; // The state of the counter input
float DeltaT=0;
SoftwareSerial mySerial(rx, tx, false);
// the setup routine runs once when you press reset:
void setup() {
// Open serial communications
Serial.begin(9600);
mySerial.begin(9600);
mySerial.listen();
pinMode(4, OUTPUT); // ouput shield darlington port
pinMode(5, OUTPUT); // ouput shield darlington port
pinMode(6, OUTPUT); // ouput shield darlington port
pinMode(7, OUTPUT); // ouput shield darlington port
pinMode(A2, OUTPUT); // ouput shield darlington port
pinMode(A3, OUTPUT); // ouput shield darlington port
pinMode(A4, OUTPUT); // ouput shield darlington port
pinMode(A5, OUTPUT); // ouput shield darlington port
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
digitalWrite(4,HIGH); // make sure all relays ar in off position
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(A2,HIGH);
digitalWrite(A3,HIGH);
digitalWrite(A4,HIGH);
digitalWrite(A5,HIGH);
// set SELECT inactive to Tiny (low==select)
pinMode(select_Tiny,OUTPUT);
digitalWrite(select_Tiny,HIGH);
Timer1.initialize(1000); // 1 msecond
Timer1.attachInterrupt( timerIsr ); // attach the service routine here
SecCounter=looptime; // start sending
}
// the loop routine runs forever:
void loop()
{
if (SecCounter >= looptime){
SecCounter = 0;
if (Tselect == false){ // we can initialise a new read from Tiny
digitalWrite(select_Tiny,LOW); // active SELECT pin (low) to get data from the 3 Tiny
Tselect=true;
SelectmSec=0;
rxBuffer="";
}
// demo relay switching
++relaypointer;
switch (relaypointer){
case 1:
digitalWrite(4,LOW); // relay on
break ;
case 2:
digitalWrite(5,LOW);
break ;
case 3:
digitalWrite(6,LOW);
break ;
case 4:
digitalWrite(7,LOW);
break ;
case 5:
digitalWrite(A2,LOW);
break ;
case 6:
digitalWrite(A3,LOW);
break ;
case 7:
digitalWrite(A4,LOW);
break ;
case 8:
digitalWrite(A5,LOW);
break ;
case 9:
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(A2,HIGH);
digitalWrite(A3,HIGH);
digitalWrite(A4,HIGH);
digitalWrite(A5,HIGH);
break ;
case 10:
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
digitalWrite(A2,LOW);
digitalWrite(A3,LOW);
digitalWrite(A4,LOW);
digitalWrite(A5,LOW);
break ;
case 11:
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(A2,HIGH);
digitalWrite(A3,HIGH);
digitalWrite(A4,HIGH);
digitalWrite(A5,HIGH);
break ;
case 12:
relaypointer = 0 ;
break ;
}
// ---------------------------start business logic-------------------------------
// Here we can do our calculations and issue switch commands to the output ports
// based on measured temperatures.
// e.g calc DeltaT from t1 and t2 and switch if bigger then 2 ºC
DeltaT = t1-t2;
if(DeltaT > 2){
digitalWrite(7,LOW);
}
else{
digitalWrite(7,HIGH);
}
//-------------------------------end business logic--------------------------------
}
if (Tselect == true && SelectmSec >= 100){ // we leave the select pulse for 100 mSec active.
// The three Tiny85 chips share a serial output bus and a common select input
// chip Tiny85 I starts sending after 10 msec (t4,t5,t6,c1,s1) 3 x DS18B20 and counter
// chip Tiny85 II after 50 msec (t1,t2) 2 x PT1000
// chip Tiny85 III after 75 msec (t3,t4) 2 x PT1000
Tselect=false;
digitalWrite(select_Tiny,HIGH); // end selectpulse
}
while (mySerial.available()){ // read available characters and put them in the buffer
c = mySerial.read();
rxBuffer = rxBuffer + c;
}
if (rxBuffer.length() > 3 ){
ParseBufferToValues();
}
}
void ParseBufferToValues(){
int EgSign = 0;
int Delimiter = 0;
String Sensor = "";
String SensorValue= "";
String tmpBuffer ="";
int lenBuffer=rxBuffer.length();
Serial.println("Buff: " + rxBuffer);
EgSign = rxBuffer.indexOf("=");
Delimiter = rxBuffer.indexOf("&");
while (EgSign > 0 && Delimiter > 0 )
{
Sensor = rxBuffer.substring(EgSign-2,EgSign);
SensorValue = rxBuffer.substring(EgSign+1,Delimiter);
tmpBuffer = rxBuffer.substring(Delimiter+1,lenBuffer);
lenBuffer = tmpBuffer.length();
rxBuffer=tmpBuffer;
Serial.println("Parse: " + Sensor + " - " + SensorValue);
if (Sensor=="t1"){t1=SensorValue.toFloat();}
if (Sensor=="t2"){t2=SensorValue.toFloat();}
if (Sensor=="t3"){t3=SensorValue.toFloat();}
if (Sensor=="t4"){t4=SensorValue.toFloat();}
if (Sensor=="t5"){t5=SensorValue.toFloat();}
if (Sensor=="t6"){t6=SensorValue.toFloat();}
if (Sensor=="t7"){t7=SensorValue.toFloat();}
if (Sensor=="c1"){c1=SensorValue.toInt();}
if (Sensor=="s1"){if(SensorValue==0){s1==false;}else{ s1==true;}}
EgSign = rxBuffer.indexOf("=");
Delimiter = rxBuffer.indexOf("&");
}
}
void timerIsr(){
++mSecCounter;
if (Tselect==true)
{
++SelectmSec;
}
if (mSecCounter >= 1000)
{
++SecCounter;
mSecCounter=0;
digitalWrite( led, digitalRead( led ) ^ 1 );
}
}