salve a tutti,
sto cercando di realizzare un affondatore per pastura in sacchetti di rete dalla barca. La parte meccanica è gia stata completata, realizzata con un motorino da tergicristallo. La parte elettronica consiste in un Arduino Mega, un display LCD 16x2, una scheda 4 relè, un keypad a membrana 3 x4. il funzionamento è semplice, premendo in combinazione due tasti il motorino fa scendere il cavetto alla profondità desiderata. Premendo i tasti per la risalita, il motorino parte e si ferma prima con un finecorsa, e poi dopo i secondi del delay. I metri della discesa sono stabiliti con un delay che tiene i relè LOW in base ai giri del motore e alla circonferenza della bobina su cui è avvolto il cavetto. Fin qui tutto bene, questa è una parte del codice, funziona, ma chiedo venia per gli errori che eventualmente ci saranno.
// AMBROGINO DA AMBROGIO DEI ROCHER E ARDUINO.
// AIUTANTE ADDETTO AL SACCHETTO DELLA PASTURA.
// MOTORE 42 GG/min - BOBINA RECUPERA 10,433 MT IN 10 SEC. = 1,0433 AL MILLISECONDO = 1 MT = 958 MSECONDI
#include <Keypad.h>
#include <LiquidCrystal.h>
const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'#','0','*'}
};
byte rowPins[ROWS] = {26, 28, 30, 32}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {34, 36, 38}; //connect to the column pinouts of the keypad
//int j = 0;
//int x = 0;
char code [2];
char key;
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
int relediscesaneg = 62; // SU IN1
int relediscesapos = 63; // SU IN2
int relesalitapos = 64; // SU IN3
int relesalitaneg= 65; // SU IN4
int stato_relediscesaneg = 0;
int stato_relediscesapos = 0;
int stato_relesalitapos = 0;
int stato_relesalitaneg = 0;
void setup()
{
Serial.begin(9600);
pinMode(relediscesapos, OUTPUT);
digitalWrite(relediscesapos, HIGH);
pinMode(relediscesaneg, OUTPUT);
digitalWrite(relediscesaneg, HIGH);
pinMode(relesalitapos, OUTPUT);
digitalWrite(relesalitapos, HIGH);
pinMode(relesalitaneg, OUTPUT);
digitalWrite(relesalitaneg, HIGH);
lcd.begin(16, 2);
lcd.print(" Ambrogino Lift ");
lcd.setCursor(0,2);
lcd.print("Ins. Prof.2 Num.");
}
void loop()
{
if (key != NO_KEY)
Serial.println(key);
key = keypad.waitForKey();
code
= key;
key = keypad.waitForKey();
code [1] = key;
// =============INIZIO BLOCCO CINQUE DIECI ============
}
if ((code[0] == '0') && (code[1] == '5')) {
lcd.setCursor(0,2);
lcd.print("Discesa 5 metri ");
digitalWrite(relediscesaneg, LOW);
digitalWrite(relediscesapos, LOW);
delay(5*958); // 4790
digitalWrite(relediscesaneg, HIGH);
digitalWrite(relediscesapos, HIGH);
lcd.setCursor(0,2);
lcd.print("Pastura a 5 mt ");
}
Volendo diminuire la velocità di discesa e se occorre aumentare la velocità di risalita, ho usato un variatore di velocità. Sorge ora la necessità di contare i giri della ruota, e ho tentato con questa altra parte di codice, che mi sembra funzioni, conta il numero di giri e lo divide per tre (il diametro è 10,6 cm) e mi restituisce i metri di profondità.
#include <LiquidCrystal.h>
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
int RELE = 64;
const int ContattoReed = A0;
int Contagiri = 0;
int Stato = 0;
int UltimoStato = 0;
int Profondita = 0;
int Metri = 0;
void setup()
{
pinMode(ContattoReed, INPUT);
pinMode(RELE, OUTPUT);
digitalWrite(RELE, HIGH);
lcd.begin(16, 2);
lcd.print(" Reed Contagiri");
lcd.setCursor(0,2);
lcd.print("contametri ");
}
void loop()
{
// digitalWrite(RELE, LOW);
// read the pushbutton input pin:
Stato = digitalRead(ContattoReed);
if (Stato != UltimoStato) {
if (Stato == HIGH)
{
delay(200);
Contagiri++;
float Metri=(Contagiri/3);
lcd.setCursor(0,2);
lcd.print("Profondita - ");
lcd.setCursor(13,2);
lcd.print(Metri,0);
}
}
UltimoStato = Stato;
// Profondita = Metri;
if (Contagiri == 3*4) {
digitalWrite(RELE, LOW);
}
if (Contagiri == 3*11) {
digitalWrite(RELE, HIGH);
//(Contagiri = 0);
lcd.setCursor(0,2);
//lcd.print(" ");
lcd.setCursor(0,2);
lcd.print("Arrivo a -");
lcd.setCursor(11,2);
lcd.print(Metri,0);
lcd.setCursor(13,2);
lcd.print(" Mt");
}
}
[
Ho cercato di unire i due codici, con l'intenzione per esempio, premendo 05 sul keypad, i relè discesa vanno in LOW, dopo 5 metri, contati dal reed, i relè vanno HIGH.
Non riesco a far funzionare questa parte di codice, chiedo aiuto , umilmente, se possibile.
Grazie
if ((code[0] == '0') && (code[1] == '3')){
{
lcd.setCursor(0,2);
lcd.print("Discesa 3 metri ");
delay(2000);
digitalWrite(relediscesaneg, LOW);
digitalWrite(relediscesapos, LOW);
{
Stato = digitalRead(ContattoReed);
if (Stato != UltimoStato)
{ if (Stato == HIGH)
{
delay(200);
Contagiri++;
float Metri=(Contagiri/3);
lcd.setCursor(0,2);
lcd.print("Profondita - ");
lcd.setCursor(13,2);
lcd.print(Metri,0);
}
UltimoStato = Stato;
if (Contagiri == 3*3) {
digitalWrite(relediscesaneg, LOW);
digitalWrite(relediscesapos, LOW);
//(Contagiri = 0);
lcd.setCursor(0,2);
//lcd.print(" ");
lcd.setCursor(0,2);
lcd.print("Arrivo a -");
lcd.setCursor(11,2);
lcd.print(Metri,0);
//lcd.setCursor(13,2);
//lcd.print(" Mt");
}
}