CTRL Arduino
CTRL Arduino
h>
#include <TimeLib.h>
#include <EEPROM.h>
#include <Time.h>
#include <math.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <DHT.h>
//DHT
#define DHTPIN 6
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
//HX711
#include <HX711_ADC.h>
#define ONE_WIRE_BUS_0 4
#define ONE_WIRE_BUS_1 8
//1-Wire
//const int pinDatosDQ = 4;
OneWire oneWireObjeto(ONE_WIRE_BUS_0);
DallasTemperature sensorDS18B20(&oneWireObjeto);
////1-Wire
//const int pinDatosDQ_2 = 8;
OneWire oneWireObjeto_2(ONE_WIRE_BUS_1);
DallasTemperature sensorDS18B20_2(&oneWireObjeto_2);
float temp5 = 0;
//PARAMETROS BASCULA
const int HX711_dout = 2; //mcu > HX711 dout pin
const int HX711_sck = 3; //mcu > HX711 sck pin
long t;
long tarevalue = 0 ;
long factor = 1 ;
long stabilizingtime = 2000;
boolean _tare = false;
HX711_ADC LoadCell(HX711_dout, HX711_sck);
float weight;
float cell_value;
float m_lcell = 1;
float b_lcell = 0;
float tempCompressor;//1-WIRE
float humidityDht11;//DHT
float temperatureDht11;//DHT
float temperatureFIFOTemp3;
float temperatureFIFOTemp4;
//ALARMAS
const int door_sensor = 5;
const int alarmOutPin = 7;
int alarms[20];
int currentValueAlarm=1;
int counterAlarm=0;
int lastValueAlarm=0;
int recognizeAlarms=0;
// filter weight
float pf =0.0;
float timeK=45.0;
float scanCycle=2.0;
int counterAverage=1;
int initialvalue=1;
//CONTROL VARIABLE
bool downloadA0, downloadA1, downloadA2, downloadA3;//estado descarga de datos
python
long lastDate;
long timerData;// temporizador general de reinicio de variables
long timerFIFO;// temporizador descarga de datos fifo
float voltage=110.0;
float fdp=0.9;
unsigned long timerSec;//tiempo arduino
unsigned long lastTimer;// seg anterior
unsigned long date;// fecha en segundos UNIX
unsigned long timeOp1, timeOp2, timeOp3, timeOp4; //datetime flanco subida y bajada
precalentamiento
String SerialRead;//valor de lectura Serial1
String dashboard;// cadena datos dashboard
String FIFO;//cadena de dato fifo
String chr44=",";//caracter de separacion de datos
//DATAPROCESSING
int strlenpython = 0;
int lenpython = 0;
int forCounter = 0;
float DSTable[50];
float currentData[50];
int DSIndex;
int Command=0;
String strData="";
String strChr="";
String strChrEnd="_";
int setParameters=0;
int eeAddress=0;
long nodata=0;
long timertemp = 0;
int nparameters=4; //numero de parametros + 1 posicion de corrimiento
int quantityData=30;
float parameters1[20];//A0 horno
float parameters2[20];//A1 consumo
float parameters3[20];//A2 cadena de frio
float parameters4[20];//A3 cadena de frio
int qParams1, qParams2, qParams3, qParams4;
int recognize=0;
int setConfig = 0;
float currentFIFOA1=0;
int count_A = 0;
int door_state = 0;
int ctrl_door_state=0;
float door_p1=0;
float door_p2=0;
float door_p3=0;
float door_pe=0;
float door_pvar=0;
float door_pavg=0;
float p_val;
float p_estiba;
int estado;
float p_pack;
int n_pack;
int x= 5;
float k = 100;
float k2 = 0;
float val1=0;
//int time_filter=0;
float filt;
int xtime=1000;
float zero=0;
float p_caja;
float p_total=0;
float gross = 0;
int timermslimit = 500;
int LED=7;
int msTime=1000;
int blinkLed=0;
int status_led=0;
long timer_ms=0;
int mslimit = 11;
void setup()
{
pinMode(door_sensor, INPUT); //sensor de puerta
//OneWire oneWireObjeto(ONE_WIRE_BUS_0);
//DallasTemperature sensorDS18B20(&oneWireObjeto);
//analogReference(INTERNAL);
Serial1.begin(57600);
sensorDS18B20.begin();
sensorDS18B20.setResolution(10);
sensorDS18B20.setWaitForConversion(false);
sensorDS18B20.requestTemperatures();
sensorDS18B20_2.begin();
sensorDS18B20_2.setResolution(11);
sensorDS18B20_2.requestTemperatures();
dht.begin();
time_t date = now ();// get hora actual en segundos
timeOpA1=date; timeOpA2=date;
door_sensor =
LoadCell.begin();
boolean _tare = false; //set this to false if you don't want tare to be performed in the next
step
LoadCell.start(stabilizingtime, _tare);
LoadCell.setCalFactor(1.0);//-96134.00);
delay(1000);
}
void loop(){
time_t date = now ();// get hora actual en segundos
/*_______________________EJECUCION DE COMANDOS_____________________
la variable 'lenpython' es > o = a cero si la palabra 'Set_t' se encuentra correctamente en
el string
validado el comando se procede a validar que tipo de comando es con el valor
almacenado en DSTable[0]
0 = NA, 1 = NA, 2 = NA, 3=Estados de descarga, 4=actualizacion hora, 5= parametros
A2, 6=parametros A3
7 = inicializacion alarmas, 8= calibracion bascula, 9= parametros generales
*/
strData=""; SerialRead=""; // inicializacion
if(setConfig ==1){
setConfig = 0;
Command=int(DSTable[0]);// movimiento comando
if(Command==3){ // reset estados de descarga de datos
if(DSTable[1]==1) { DSTable[1]=0, downloadA0=0;}//
if(DSTable[2]==1) { DSTable[2]=0, downloadA1=0, currentFIFOA1 = 0;}//
if(DSTable[3]==1) { DSTable[3]=0, downloadA2=0;}//
if(DSTable[4]==1) { DSTable[4]=0, downloadA3=0;}// =0 envia estado actual de
arduino =1 dato habilitado para descarga
Command=0;
}
if(Command==4){ // establecimiento de hora
time_t lastDate = now ();// get hora actual en hora anterior segundos
date=DSTable[1];//movimiento de index hora a variable hora
setTime(date); //establecimiento de hora
timeOpfinA1=date-(lastDate-timeOpfinA1);
timeOpfinA2=date-(lastDate-timeOpfinA2); // actualizacion de todos los registros de
hora
timeOpA1=date-(lastDate-timeOpA1);
timeOpA2=date-(lastDate-timeOpA2);
timeOp1=date-(lastDate-timeOp1);
timeOp2=date-(lastDate-timeOp2);
timeOp3=date-(lastDate-timeOp3);
timeOp4=date-(lastDate-timeOp4);
Command=0;
Serial1.println("SetHour_ok, " + String(date) + "," +String(lastDate)+ "," + "#" );
}
if(Command==5){ //parametros evaporador
c1A2=DSTable[1];
c2A2=DSTable[2];
c3A2=DSTable[3];
Command=0;
}
if(Command==6){ //parametros defrost
c1A3=DSTable[1];
c2A3=DSTable[2];// codigo para parametro de otra entrada analoga
c3A3=DSTable[3];//
Command=0;
}
if(Command==7){//recognize alarm
Command=0;
m_lcell = DSTable[1];
b_lcell = DSTable[2];
offset_lcell = DSTable[3];
w_factor = DSTable[4];
}
if(Command==8){//recognize alarm
Command=0;
recognize=0;
}
if(Command==9){//parametros generales
Command=0;
timeK=DSTable[1];
scanCycle=DSTable[2];
timeLimitA2=DSTable[3];
timeLimitA1=DSTable[4];
//x= DSTable[5];
//xtime = DSTable[6];
}
if(Command==10){//parametros generales
Command=0;
k_A1=DSTable[3];
v_A1=DSTable[4];
}
if(Command==11){//parametros generales
//Serial1.println("configure 2 , " + String(DSTable[4]) );
xtime=DSTable[1];
x=DSTable[2];
timermslimit=DSTable[3];
mslimit = DSTable[4];
//w_factor = DSTable[5];
k = DSTable[6];
}
}
timerSec = millis();// cronometro de arduino, base para todos los temporizadores del codigo
timerSec = timerSec/1000; //base en segundos
time_filter++;
//float door_p1=0;
//float door_p2=0;
//float door_p3=0;
//float door_pe=0;
//float door_pvar=0;
//float door_pavg=0;
if(time_filter>xtime){
time_filter=0;
cell_value = LoadCell.getData(); // Celda de carga
LoadCell.update();
weight=abs((((m_lcell*cell_value)+b_lcell)*w_factor)+(offset_lcell));
door_state = digitalRead(door_sensor); //lectura digital de pin
if(door_state==1 == ctrl_door_state==0){
ctrl_door_state=1;
door_p1= gross;
}
if(door_state==1 == ctrl_door_state==1){
ctrl_door_state=0;
door_p2 = weight;
door_pvar = abs(door_p2 - door_p1);
door_pe = abs(door_p3 - door_p1);
if(ctrl_door_state==1){
if(inRange(abs(weight-p_anterior), 0,k)==0){
count_val++;
if (z == 0){
p_val = weight;
z=1;
status_led=0;
}
//temporizadores
if(timerSec != lastTimer) // diferencia de dato para incremental de un segundo
{
//FIFO
if((downloadA1==1 || downloadA2==1 || downloadA3==1) && timerFIFO>23)
{
FIFO= "D_,"+String(downloadA1) + ",1"
+chr44+String(timeFIFO1A1)+chr44+String(timeFIFO2A1)+",0,0"+chr44+String(currentFIFO
A1)+chr44+String(consumptionWOpA1)+chr44+String(cycleCounterFIFOA1)+",%," +
String(downloadA2) + ",2"
+chr44+String(timeFIFO1A2)+chr44+String(timeFIFO2A2)+chr44+String(temperatureFIFOA
2,1)+chr44+String(temperatureFIFOA3,1)+chr44+ String(temperatureFIFOTemp3,1)+
chr44+String(temperatureFIFOTemp4,1) +chr44+ String(weight)
+chr44+String(humidityDht11,1)+",_";
Serial1.println(FIFO);
timerFIFO=0;
//Serial1.flush ();
}
if(stateSequenceA1 == 0){
stateSequenceA1 = 1;
cycleCounterA1++;
}
//POTENCIA ACUMULADA A1
if(stateSequenceA1 == 1 && resultValueA1 < 0.5)
{
stateSequenceA1 = 0;
lastValueA1 = 0;
timeOpfinA1 = date;
accumulatedPowerA_A1 = accumulatedPowerA_A1+accumulatedPowerB_A1;
accumulatedPowerB_A1 = 0;
}