Salve a tutti!
Questo è il mio primo post, e avrei bisogno di un aiutino in quanto mi ritrovo bloccato su alcune cose.. premetto che sono un principiante, ho iniziato da pochissimo e tutto ciò che so sulla programmazione viene proprio dal forum!! grazie a tutti quelli che contribuiscono.
Questo è lo sketch, fa tutto quello che deve fare eccetto variare ogni volta le celle dove vengono scritte le variabili in modo da utilizzare la FRAM completamente... non riesco a capire cosa devo fare...
inoltre, visto che sono alle basi, esistono funzioni o comandi per semplificare o migliorare il mio schizzo? Apprezzerei molto qualsiasi aiuto così da poter migliorare, grazie a chiunque mi aiuti!
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include "Adafruit_FRAM_SPI.h"
uint8_t FRAM_CS = 10; //utilizzo di hardware SPI
Adafruit_FRAM_SPI fram = Adafruit_FRAM_SPI(FRAM_CS);
#define I2C_ADDR 0X27 // defininizioni necessarie per problematiche relative all'utilizzo
#define BACKLIGHT_PIN 3 // di uno schermo con interfaccia I2C economico che presenta diverse limitazioni
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
#define PULSANTI 2 // definizione di input e output
#define MOTORE 8
#define MICROSTOP 3
#define JOG 4
#define salva 5
#define su 7
#define giu 6
int val = LOW; // variabili per usare i pulsanti come interruttore ed evitare doppie letture
int vecchio_val = LOW;
int val2= LOW;
int vecchio_val2 = LOW;
int val3 = LOW;
int vecchio_val3 = LOW;
int stato=0; // variabile necessaria per la creazione dell'evento allarme
int statosu = 0;
int statogiu = 0; // variabili per settare il delay per il motore
int statosalva = 0;
byte pos_et; // variabile salvata nella FRAM per regolare il delay del motore
unsigned long prevMillis = 0; // funzione millis() per far si che il motore dopo un po che và entri in errore
unsigned long interval = 2000;
unsigned int datofram; // variabili utilizzate per shiftare i bit e ricomporre il numero superiore a 255
byte a1 = 0;
byte a2 = 0;
byte intPt0 = 0;
byte intPt1 = 0;
LiquidCrystal_I2C LCD(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
void setup(){
fram.begin();
pinMode(PULSANTI, INPUT);
pinMode(MICROSTOP, INPUT);
pinMode(MOTORE,OUTPUT);
pinMode(JOG,INPUT);
pinMode(salva, INPUT);
pinMode(su, INPUT);
pinMode(giu, INPUT);
intPt0 = fram.read8(5); //lettura celle 5 e 6 della FRAM
intPt1 = fram.read8(6);
datofram = ((intPt1 << 8) | intPt0);; //ricostruzione del numero nelle celle 5 e 6
LCD.begin(16,2); //accensione dello schermo difettoso
LCD.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
LCD.setBacklight(HIGH);
LCD.home();
LCD.setCursor(3,0);
LCD.print("AREADERMA");
delay(2000);
LCD.clear();
if (fram.begin()) { // verifica della presenza o meno della FRAM
LCD.setCursor(1,0);
LCD.print("Ricerca dati..");
delay(500);
}
else {
LCD.setCursor(0,0);
LCD.print("Nessun dato");
while (1);
}
pos_et = fram.read8(1);
LCD.clear();
}
void loop(){
datofram>=0;
LCD.setCursor(0,0); //schermata LCD
LCD.print("Etichette ");
LCD.print(datofram);
LCD.setCursor(0,1);
LCD.print("Posizione: ");
LCD.print(pos_et);
statosu = digitalRead (su);
if( statosu == HIGH)
{ delay(100);
LCD.clear();
pos_et++;} //incrementa il valore alla pressione del pulsante "su"
statogiu = digitalRead (giu);
if( statogiu == HIGH)
{delay(100);
LCD.clear();
pos_et--;} //decrementa il valore alla pressione del pulsante "giu"
statosalva = digitalRead (salva);
if (statosalva == HIGH)
{fram.writeEnable(true); //salvataggio variabile nella cella 1
fram.write8(1,pos_et);
fram.writeEnable(false);
LCD.setCursor(15,1);
LCD.print("S");
}
val = digitalRead(PULSANTI);
if ((val == HIGH) && (vecchio_val == LOW)){ //input motore con funzione millis()
prevMillis = millis();
digitalWrite(MOTORE,HIGH);
stato = 1;
}
vecchio_val = val;
if (( stato==1) && (millis()-prevMillis>=interval)){
digitalWrite(MOTORE,LOW);
LCD.clear();
LCD.setCursor(0,0);
LCD.print("ERRORE ETICHETTE"); //errore se il motore reata attivo oltre 3 secondi
LCD.setCursor(1,1);
LCD.print("...attendere...");
stato=0;
delay(3000);
LCD.clear();
}
val2=digitalRead(MICROSTOP);
if ((val2 == HIGH) && (vecchio_val2 == LOW)){
delay(pos_et*10);
stato=0;
datofram++;
a1 = byte(datofram); // si scompone l'intero in 2 byte
a2 = byte( datofram >> 8);
fram.writeEnable(true);
fram.write8(5, a1);
fram.writeEnable(false);
fram.writeEnable(true);
fram.write8(6, a2);
fram.writeEnable(false);
digitalWrite(MOTORE, LOW);
}
vecchio_val2 = val2;
val3 = digitalRead(JOG);
if ((val3 == HIGH) && (vecchio_val3 == LOW)){ //input secondario usato per fare avanzamenti manuali
stato=0;
delay(10);
digitalWrite (MOTORE,HIGH);
}
vecchio_val3 = val3;
}