// include <LiquidCrystal.h>
// Dalla verione G si implementano gli ingressi GPI a fotoaccoppiatore
// Dalla versione F si implementa il display Lcd
// su piattaforma Mega 2560
// Il diplay Lcd è implementato nella fase che quando si imposta una uscita Gpi
//lui la indica
//
/*
Verione H si continua ad implementare gli ingressi a fotoaccoppiatore
Problemi da risolvere
OKOK Capire perchè si blocca attivando sopra il gpi 10
OKOK il problema era che il carattere di fine byte era 10
OKOK dire a stefano di cambiare byte di fine parola
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 4);
//#include <SoftwareSerial.h>
// SoftwareSerial mySerial(2, 3); // RX, TX
const unsigned int MAX_MESSAGE_LENGHT = 12;
# define ledpin 13 //
byte conta = 0;
int incomingData = 0; // for incoming serial data
int datatest = 0;
int x1 = 0;
int x2 = 0;
int x3 = 0;
int x4 = 0;
int val = 0;
int zero=0;
void setup() {
// put your setup code here, to run once:
lcd.begin(40, 4);
lcd.backlight();
lcd.print("Hwd vers. 1.0");
lcd.setCursor(0,1);
lcd.print("Swt Gpi rev_F");
lcd.setCursor(0,2);
lcd.print("Initialize");
lcd.blink();
delay(1000);
lcd.setCursor(0,3);
lcd.print("GO!");
delay(1000);
lcd.clear();
Serial.begin(9600); // Seriale Hardware
Serial2.begin(9600); // Seriale Hardware
pinMode(ledpin, OUTPUT); // trigger pinMode(11,OUTPUT);
// inizializzazione porte di comando relè Gpi
//Da pin 22 a 37 come uscita a livello alto iniziale
conta = 0;
for (int conta = 22; conta <= 37; conta++) {
pinMode(conta,OUTPUT);
digitalWrite(conta,HIGH);
}
// inizializzazione porte di comando relè Gpi
//Da pin 38 a 53 come ingressi pull up
conta = 0;
for (int conta = 38; conta <= 53; conta++) {
pinMode(conta,INPUT_PULLUP);
// digitalWrite(conta,HIGH);
}
digitalWrite(ledpin, LOW);
// Imposta display LCD
lcd.print("GPI 123456789ABCDEFG");
lcd.setCursor(0,1);
lcd.print("OUT");
lcd.setCursor(0,2);
lcd.print(" IN");
lcd.blink();
delay(10);
lcd.setCursor(0,3);
lcd.print("RUNNING");
delay(10);
}
//------------------------------------------------------------------------------------------------------------------------------------
void loop() {
// put your main code here, to run repeatedly:
ControllaSeriale();
InterfaceCheck();
WriteOut ();
StatoGpiOut ();
StatoGpiIn ();
}
void ControllaSeriale() {
//Serial1.write("Start"); // Print as an ASCII-encoded hexadecimal
while (Serial2.available() > 0)
{
//create a place to store message
static char message[MAX_MESSAGE_LENGHT];
static unsigned int message_pos = 0;
//Read the next avaible byte in the serial receive buffer
byte inByte = Serial2.read();
//Controllo che non ci sia un carattere di terminazione
//if (inByte != '\n')
if (inByte != 0xff)
{
//Add the coming byte to our message
message[message_pos] = inByte;
message_pos++;
}
// Full message received...
else
{
//Add null charatcter to string
//message[message_pos] = '\0';
// print the message e salvo la matrice in 4 variabili diverse
// Serial.println(message);
x1 = message[0];
x2 = message[1];
x3 = message[2];
x4 = message[3];
digitalWrite(ledpin, HIGH);
message[0] == 0;
message[1] == 0;
message[2] == 0;
message[3] == 0;
message_pos = 0;
}
}
return;
}
// caso di ricezione Interface Check
void InterfaceCheck() {
if (x1==0x49 & x2==0x43)
{
// digitalWrite(13,HIGH);
Serial.println(x1, HEX);
Serial.println(x2, HEX);
//delay (100);
Serial2.write(0X10); // Print as an ASCII-encoded hexadecimal
Serial2.write(0X01); // Print as an ASCII-encoded hexadecimal
delay (1000); // Valutare questo ritardo se toglierlo
digitalWrite(13, LOW);
}
x1==0;
x2==0;
x3==0;
x4==0;
return;
}
void WriteOut () {
// Caso di ricezione Write Out
if (x1==0x57 & x2==0x4F)
{
int c = x3 + 0x16; // aggiungo 22 perchè il primo gpi è collegato sull'uscita 22
int d = x4 & 0x01; // faccio l'and per estrarre il bit 1 (anche se non servirebbe)
if (d == 1)
{
digitalWrite (c, LOW); //Attenzione.. le uscite pilotaggio gpi sono a logica inversa
}
else
{
digitalWrite(c, HIGH);
}
// Serial.println(c, HEX);
// Serial.println(d, HEX);
Serial.println(x3, DEC);
Serial.println(c, HEX);
Serial2.write(0X10); // Print as an ASCII-encoded hexadecimal
Serial2.write(0X01); // Print as an ASCII-encoded hexadecimal
//lcd.print("Gpi Attivato");
// delay(1000);
// lcd.clear();
//message[0] = 0;
//message[1] = 0;
//message[2] = 0;
//message[3] = 0;
//x1 = 0;
//x2 = 0;
//x3 = 0;
//x4 = 0;
delay (10);
//digitalWrite(13, LOW);
// Lettura stato GPI in uscita per invio al display LCD
// si parte dal bit porta 22 byte LSB
byte Gpi01 = 0b00000000;
for (int i = 22; i <= 29; i++) {
val = digitalRead(i);
val = not (val);
int z = i - 22;
bitWrite (Gpi01, z, val);
}
// si parte dal bit porta 30 byte MSB
byte Gpi02 = 0b00000000;
for (int i = 30; i <= 37; i++) {
val = digitalRead(i);
val = not (val);
int z = i - 30;
bitWrite (Gpi02, z, val);
}
// Invio il dato al display lcd
//stampo primo Byte MSB su LCD
lcd.setCursor(4,1);
for (int i = 0; i <= 7; i++) {
conta = bitRead (Gpi01, i);
lcd.setCursor(4+i,1);
if (conta == 0) {
lcd.print ("0");
}
else lcd.print ("1");
}
//stampo secondo Byte LSB su LCD
lcd.setCursor(12,1);
for (int i = 0; i <= 7; i++) {
conta = bitRead (Gpi02, i);
lcd.setCursor(12+i,1);
if (conta == 0) {
lcd.print ("0");
}
else lcd.print ("1");
}
}
return;
}
// Caso di ricezione richiesta stato GPI out attenzione variato a 16 bit
void StatoGpiOut () {
if (x1==0x43 & x2==0x4F)
{
//digitalWrite(13,HIGH);
// si parte dal bit porta 22 byte LSB
byte Gpi01 = 0b00000000;
for (int i = 22; i <= 29; i++) {
val = digitalRead(i);
// Serial.println(i);
val = not (val);
int z = i - 22;
bitWrite (Gpi01, z, val);
}
// si parte dal bit porta 30 byte MSB
byte Gpi02 = 0b00000000;
for (int i = 30; i <= 37; i++) {
val = digitalRead(i);
// Serial.println(i);
val = not (val);
int z = i - 30;
bitWrite (Gpi02, z, val);
}
delay (10);
Serial2.write(0x41);
Serial2.write(0x4f);
Serial2.write(Gpi02);
Serial2.write(Gpi01);
delay (10);
//digitalWrite(13, LOW);
}
return;
}
// Richiesta stato GPi ingresso
void StatoGpiIn () {
if (x1==0x43 & x2==0x49)
{
delay (50);
Serial2.write(0x41);
Serial2.write(0x49);
Serial2.write(zero);
Serial2.write(zero);
// Serial1.write(0X0A);
// Reset for the next message
}
return;
}