Lab_interaccio/2022/Farm_microwaves/FARM_pulsos/FARM_pulsos.ino
2025-02-25 21:29:42 +01:00

618 lines
14 KiB
C++

#include <SPI.h>
//#include "wiring_private.h"
#include <Ethernet.h>
#include <EthernetUdp.h>
//#define echoPin1 12
#define echoPin1 9
#define echoPin2 6
#define echoPin3 11
//#define echoPin4 9
#define echoPin4 12
#define IP 11
#define SENSORQTY 2
#define PULSEDURATION 5000
#define DEBUG 0
int dipPin[7] = { 1, 0, A5, 20, 21, 5, 13};
int sensor1, sensor2, sensor3, sensor4;
short flags1 = 1;
short flags2 = 1;
short flags3 = 1;
short flags4 = 1;
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xE0+IP
};
IPAddress ip(192, 168, 21, IP); // Direccion local
IPAddress destIp(192, 168, 21, 51); // Direccion del servidor 192.168.21.51 (TIMELINE SERVER)
unsigned int localPort = 8888; // local port to listen on
unsigned int destPort = 9999; // TO SET SENDING PORT
// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
#define UDP_RX_PACKET_MAX_SIZE 8
//#define CE_PIN A1
#define CSN_PIN 10
uint32_t CMD[ 8 ]; // CMD + PARAM
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; // buffer to hold incoming packet,
char ReplyBuffer[] = "Hello, i'm BOX XX "; // a string to send back
char sensorBuffer[] = "id:xx,sx:x ";
unsigned long previousMillis1 = 0;
unsigned long previousMillis2 = 0;
unsigned long previousMillis3 = 0;
unsigned long previousMillis4 = 0;
void resetBoard()
{
//Serial.println("reset");
NVIC_SystemReset(); // esta funcion en teoria si funciona en SAMD
}
byte id()
{
int id = 0;
for (byte i = 0; i < 4; i++ ) bitWrite(id, i, digitalRead(dipPin[i]));
return id;
}
byte sensorNum()
{
int id = 0;
for (byte i = 4; i < 6; i++ ) bitWrite(id, i-4, digitalRead(dipPin[i]));
return id;
}
void setup()
{
if(DEBUG)
{
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
}
pinMode(echoPin1, INPUT);
pinMode(echoPin2, INPUT);
pinMode(echoPin3, INPUT);
pinMode(echoPin4, INPUT);
for (int i = 0; i < 7; i++)
{
pinMode(dipPin[i], INPUT);
}
if(digitalRead(dipPin[6])) // si modo DIP manual -> pin dip7 HIGH -> LED 13 ON por hardware
{
mac[5] = 0xE0 + id();
IPAddress ip2(192, 168, 21, id()); // Direccion local en modo manual DIP
Ethernet.begin(mac, ip2);
}
else
Ethernet.begin(mac, ip); // // Direccion local en modo HARDCODED
if(DEBUG)
{
Serial.println("IP ADDRESS: ");
Serial.println(Ethernet.localIP());
byte macBuffer[6]; // create a buffer to hold the MAC address
Ethernet.MACAddress(macBuffer); // fill the buffer
Serial.print("The MAC address is: ");
for (byte octet = 0; octet < 6; octet++)
{
Serial.print(macBuffer[octet], HEX);
if (octet < 5) {
Serial.print('-');
}
}
Serial.println();
}
/*
// Check for Ethernet hardware present
if (Ethernet.hardwareStatus() == EthernetNoHardware) {
Serial.println("Ethernet shield was not found. Sorry, can't run without hardware. :(");
while (true) {
delay(1); // do nothing, no point running without Ethernet hardware
}
}
if (Ethernet.linkStatus() == LinkOFF) {
Serial.println("Ethernet cable is not connected.");
}
*/
Udp.begin(localPort);
if(DEBUG)
{
Serial.println("---- DIP CONFIG -----");
Serial.print("id (dip): ");
Serial.println(id());
Serial.print("Mode (dip): ");
Serial.println(digitalRead(dipPin[6]));
Serial.print("Sensor QTY (dip): ");
Serial.println(sensorNum());
Serial.println("---------");
}
}
void reboot()
{
if(DEBUG)
Serial.println("reset");
resetBoard();
}
void check_sensor1()
{
sensor1 = digitalRead(echoPin1);
if( (sensor1) & flags1 )
{
Serial.println("sensor 1: OFF -------- RAW");
flags1 = 0;
}
else if ( (!sensor1) & !flags1 )
{
Serial.println("sensor 1: ON -------- RAW");
flags1 = 1;
}
}
void check_sensor1_pulse()
{
sensor1 = digitalRead(echoPin1);
if ( (sensor1) & flags1 ) // DETECTO EL CERO Y CUENTO TIEMPO PARA PULSO OFF
{
//Serial.println("sensor 1: OFF -------- RAW ");
flags1 = 0;
previousMillis1 = millis();
}
else if ( (!sensor1) & !flags1 ) // DETECTO FLANCO POSITIVO
{
if(DEBUG)
Serial.println("sensor 1: ON -------- RAW ");
flags1 = 1;
//previousMillis1 = millis();
if(digitalRead(dipPin[6])) // si modo DIP manual -> pin dip7 HIGH -> LED 13 ON por hardware
sprintf(sensorBuffer, "id:%d,s1:1\r\n", id());
else
sprintf(sensorBuffer, "id:%d,s1:1\r\n", IP);
Udp.beginPacket(destIp, destPort);
//Udp.write("id");
//Udp.write( String(IP) );
//Udp.write("S1:1\r\n");
Udp.write(sensorBuffer);
Udp.endPacket();
delay(30);
}
else if( ( millis() - previousMillis1 > PULSEDURATION) & !flags1 )
{
if(DEBUG)
Serial.println("sensor 1: OFF -------- PULSE ");
flags1 = 1;
if(digitalRead(dipPin[6])) // si modo DIP manual -> pin dip7 HIGH -> LED 13 ON por hardware
sprintf(sensorBuffer, "id:%d,s1:0\r\n", id());
else
sprintf(sensorBuffer, "id:%d,s1:0\r\n", IP);
Udp.beginPacket(destIp, destPort);
//Udp.write("id");
//Udp.write(IP);
//Udp.write("S1:0\r\n");
Udp.write(sensorBuffer);
Udp.endPacket();
delay(30);
}
}
void check_sensor2()
{
sensor2 = digitalRead(echoPin2);
if( (sensor2) & flags2 )
{
if(DEBUG)
Serial.println("sensor 2: OFF --------------- ");
flags2 = 0;
}
else if ( (!sensor2) & !flags2 )
{
if(DEBUG)
Serial.println("sensor 2: ON ");
flags2 = 1;
}
}
void check_sensor2_pulse()
{
sensor2 = digitalRead(echoPin2);
if ( (sensor2) & flags2 ) // DETECTO EL CERO Y CUENTO TIEMPO PARA PULSO OFF
{
//Serial.println("sensor 2: OFF -------- RAW ");
flags2 = 0;
previousMillis2 = millis();
}
else if ( (!sensor2) & !flags2 ) // DETECTO FLANCO POSITIVO
{
if(DEBUG)
Serial.println("sensor 2: ON -------- RAW ");
flags2 = 1;
//previousMillis2 = millis();
Udp.beginPacket(destIp, destPort);
//Udp.write("S2:1");
if(digitalRead(dipPin[6])) // si modo DIP manual -> pin dip7 HIGH -> LED 13 ON por hardware
sprintf(sensorBuffer, "id:%d,s2:1\r\n", id());
else
sprintf(sensorBuffer, "id:%d,s2:1\r\n", IP);
Udp.write(sensorBuffer);
Udp.endPacket();
delay(30);
}
else if( ( millis() - previousMillis2 > PULSEDURATION) & !flags2 )
{
if(DEBUG)
Serial.println("sensor 2: OFF -------- PULSE ");
flags2 = 1;
if(digitalRead(dipPin[6])) // si modo DIP manual -> pin dip7 HIGH -> LED 13 ON por hardware
sprintf(sensorBuffer, "id:%d,s2:0\r\n", id());
else
sprintf(sensorBuffer, "id:%d,s2:0\r\n", IP);
Udp.beginPacket(destIp, destPort);
//Udp.write("S2:0");
Udp.write(sensorBuffer);
Udp.endPacket();
delay(30);
}
}
void check_sensor3()
{
sensor3 = digitalRead(echoPin3);
if( (sensor3) & flags3 )
{
if(DEBUG)
Serial.println("sensor 3: OFF --------------- ");
flags3 = 0;
}
else if ( (!sensor3) & !flags3 )
{
if(DEBUG)
Serial.println("sensor 3: ON ");
flags3 = 1;
}
}
void check_sensor3_pulse()
{
sensor3 = digitalRead(echoPin3);
if ( (sensor3) & flags3 ) // DETECTO EL CERO Y CUENTO TIEMPO PARA PULSO OFF
{
//Serial.println("sensor 3: OFF -------- RAW ");
flags3 = 0;
previousMillis3 = millis();
}
else if ( (!sensor3) & !flags3 ) // DETECTO FLANCO POSITIVO
{
if(DEBUG)
Serial.println("sensor 3: ON -------- RAW ");
flags3 = 1;
//previousMillis3 = millis();
if(digitalRead(dipPin[6])) // si modo DIP manual -> pin dip7 HIGH -> LED 13 ON por hardware
sprintf(sensorBuffer, "id:%d,s3:1\r\n", id());
else
sprintf(sensorBuffer, "id:%d,s3:1\r\n", IP);
Udp.beginPacket(destIp, destPort);
//Udp.write("S3:1");
Udp.write(sensorBuffer);
Udp.endPacket();
delay(30);
}
else if( ( millis() - previousMillis3 > PULSEDURATION) & !flags3 )
{
if(DEBUG)
Serial.println("sensor 3: OFF -------- PULSE ");
flags3 = 1;
if(digitalRead(dipPin[6])) // si modo DIP manual -> pin dip7 HIGH -> LED 13 ON por hardware
sprintf(sensorBuffer, "id:%d,s3:0\r\n", id());
else
sprintf(sensorBuffer, "id:%d,s3:0\r\n", IP);
Udp.beginPacket(destIp, destPort);
//Udp.write("S3:0");
Udp.write(sensorBuffer);
Udp.endPacket();
delay(30);
}
}
void check_sensor4()
{
sensor4 = digitalRead(echoPin4);
if( (sensor4) & flags4 )
{
if(DEBUG)
Serial.println("sensor 4: OFF --------------- ");
flags4 = 0;
}
else if ( (!sensor4) & !flags4 )
{
if(DEBUG)
Serial.println("sensor 4: ON ");
flags4 = 1;
}
}
void check_sensor4_pulse()
{
sensor4 = digitalRead(echoPin4);
if ( (sensor4) & flags4 ) // DETECTO EL CERO Y CUENTO TIEMPO PARA PULSO OFF
{
//Serial.println("sensor 2: OFF -------- RAW ");
flags4 = 0;
previousMillis4 = millis();
}
else if ( (!sensor4) & !flags4 ) // DETECTO FLANCO POSITIVO
{
if(DEBUG)
Serial.println("sensor 4: ON -------- RAW ");
flags4 = 1;
//previousMillis4 = millis();
if(digitalRead(dipPin[6])) // si modo DIP manual -> pin dip7 HIGH -> LED 13 ON por hardware
sprintf(sensorBuffer, "id:%d,s4:1\r\n", id());
else
sprintf(sensorBuffer, "id:%d,s4:1\r\n", IP);
Udp.beginPacket(destIp, destPort);
//Udp.write("S4:1");
Udp.write(sensorBuffer);
Udp.endPacket();
delay(30);
}
else if( ( millis() - previousMillis4 > PULSEDURATION) & !flags4 )
{
if(DEBUG)
Serial.println("sensor 4: OFF -------- PULSE ");
flags4 = 1;
sprintf(sensorBuffer, "id:%d,s4:0\r\n", IP);
Udp.beginPacket(destIp, destPort);
//Udp.write("S4:0");
if(digitalRead(dipPin[6])) // si modo DIP manual -> pin dip7 HIGH -> LED 13 ON por hardware
sprintf(sensorBuffer, "id:%d,s4:0\r\n", id());
else
sprintf(sensorBuffer, "id:%d,s4:0\r\n", IP);
Udp.write(sensorBuffer);
Udp.endPacket();
delay(30);
}
}
void loop()
{
////////////////////////////////////////////////////////////
/////// RUTINA TRATAMIENTO DE SENSORES /////////////
////////////////////////////////////////////////////////////
if(digitalRead(dipPin[6])) // si modo DIP manual -> pin dip7 HIGH -> LED 13 ON por hardware
{
switch (sensorNum()) // en modo manual chequeo bits de numero de sensores activos
{
case 0:
check_sensor1_pulse();
check_sensor2_pulse();
break;
case 1:
check_sensor1_pulse();
check_sensor2_pulse();
break;
case 2:
check_sensor1_pulse();
check_sensor2_pulse();
check_sensor3_pulse();
break;
case 3:
check_sensor1_pulse();
check_sensor2_pulse();
check_sensor3_pulse();
check_sensor4_pulse();
break;
}
}
else // modo hardcoded en firmware y flash eeprom con UDP config
{
switch (SENSORQTY) // en modo hardcoded
{
case 2:
check_sensor1_pulse();
check_sensor2_pulse();
break;
case 3:
check_sensor1_pulse();
check_sensor2_pulse();
check_sensor3_pulse();
break;
case 4:
check_sensor1_pulse();
check_sensor2_pulse();
check_sensor3_pulse();
check_sensor4_pulse();
break;
}
}
////////////////////////////////////////////////////////////
/////// RUTINA TRATAMIENTO DE COMANDOS UDP /////////////
////////////////////////////////////////////////////////////
int packetSize;
if ( (packetSize = Udp.parsePacket()) > 0)
{
//Serial.print("mensaje recibido: ");
//Serial.println(size);
while (packetSize--)
{
IPAddress remote = Udp.remoteIP();
if(DEBUG)
{
Serial.print("Received packet of size ");
Serial.println(packetSize);
Serial.print("From ");
for (int i=0; i < 4; i++) {
Serial.print(remote[i], DEC);
if (i < 3) {
Serial.print(".");
}
}
Serial.print(", port ");
Serial.println(Udp.remotePort());
}
// read the packet into packetBuffer
Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
if(DEBUG)
{
Serial.println("Contents:");
Serial.println(packetBuffer);
}
// send a reply to the IP address and port that sent us the packet we received
Udp.beginPacket(Udp.remoteIP(), destPort);
if(digitalRead(dipPin[6])) // si modo DIP manual -> pin dip7 HIGH -> LED 13 ON por hardware
sprintf(ReplyBuffer, "Hello, i'm BOX:%d\r\n", id());
else
sprintf(ReplyBuffer, "Hello, i'm BOX:%d\r\n", IP);
Udp.write(ReplyBuffer);
Udp.endPacket();
}
}
//delay(10);
}