Buongiorno, stò iniziando ad usare Arduino Uno per poi passare ad Arduino Mega 2560, vedendo gli esempi pubblicati su internet sto imparando a capire la programmazione. Tra qualche copia incolla e qualche modifica cerco di imparare il linguaggio. Ho qualche conoscenza base in elettronica e Arduino è quasi a caso mio.
Il primo problema è che il servomotore non si muove, in pratica deve andare da 0 a 180°
L'altro problema è che quando mi soffermo alla posizione del menù dove mi fà visualizzare lo stato della botola aperta/chiusa non riesco ad andare ne avanti ne indietro.
La funzione del led che mi fa vedere lo stato delle botole, lo devo ricopiare in tutti i punti del menù per vedere la posizione aperto/chiuso? C'è un'alternativa? L'errore dov'è?
Per mancanza di spazio in questo messaggio, taglio il menù
P.S.
E' facile che nello skech sia rimasto qualche residuo di comando di qualche altra prova fatta in precedenza.
Grazie per l'attenzione.
#define butUp 12
#define butDown 11
#define butP 10
#define LampRed 13
#define LampRed2 1
#define LampRed3 5
#define LampGreen 6
#define LampRele 8
#define LampRele2 7
#define PhotoSensor A0
#define PhotoSensor A1
#define PhotoSensor A2
#include <Servo.h>
Servo myServo;
int pos = 0;
//Funzioni dei vari cicli
void changeMenu();
void dispMenu();
void mostraMsg();
void controlLed();
void controlLed2();
void controlRele();
void temperatura();
void temperatura2();
void temperatura3();
void controlRele2();
void controlBotola();
//Variabili globali
char menu = 0x01;
char set1 = 0x00, set2 = 0x00 , set3 = 0x00;
boolean t_butUp, t_butDown, t_butP, t_butM;
int relay2 =7;
int relay =8;
int sensorValue = 0;
int reading = 0;
int sensorPin = A0;
int sensorValue2 = 0;
int reading2 = 0;
int sensorPin2 = A1;
int sensorValue3 = 0;
int reading3 = 0;
int sensorPin3 = A2;
int angle = 0;
const int pinServo = 9;
const float baseline_Temp = 20;
//DISPLAY Mappa Hardware
#include <OneWire.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
const int servoMin = 165;
const int servoMax = -30;
Servo myservo
LiquidCrystal_I2C lcd(0x3f, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
void setup() {
{
myservo.attach(9);
}
lcd.begin(16, 2);
for (char i=9; i<13; i++){
pinMode(i, INPUT_PULLUP);
}
pinMode(3,OUTPUT);
pinMode(LampRed, OUTPUT);
pinMode(LampRed2, OUTPUT);
pinMode(LampRed3, OUTPUT);
pinMode(LampGreen, OUTPUT);
pinMode(LampRele, OUTPUT);
pinMode(relay,OUTPUT);
digitalWrite (LampRele, HIGH);
t_butUp = 0x00; //Inizializza le variabili come ZERO
t_butDown = 0x00;
t_butP = 0x00;
t_butM = 0x00;
}
void loop() {
changeMenu();
dispMenu();
}
//Funzioni
void changeMenu(){
if(digitalRead(butUp) == 0x00){ //Setta la variabile in 1 se si preme il pulsante UP
t_butUp = 0x01;
}
if(digitalRead(butDown) == 0x00){ //Setta la variabile in 1 se si preme il pulsante DOWN
t_butDown = 0x01;
}
if(digitalRead(butUp) && t_butUp){
t_butUp = 0x00;
lcd.clear();
menu++;
if(menu > 0x09){
menu = 0x01;
}
}
if(digitalRead(butDown) && t_butDown){
t_butDown = 0x00;
lcd.clear();
menu--;
if(menu < 0x01){
menu = 0x09;
}
}
}
void dispMenu(){
switch(menu){
case 0x01:
controlLed();
break;
case 0x02:
controlLed2();
break;
case 0x03:
temperatura();
break;
case 0x04:
temperatura2();
break;
case 0x05:
temperatura3();
break;
case 0x06:
controlRele2();
break;
case 0x07:
controlRele();
break;
case 0x08:
controlBotola();
break;
}
}
void controlLed(){
lcd.setCursor(0,0);
lcd.print("ACCENSIONE LED 1");
if(digitalRead(butP) == 0x00){
t_butP = 0x01;
}
if(digitalRead(butM) == 0x00){
t_butM = 0x01;
}
if(digitalRead(butP) && t_butP){
t_butP = 0x00;
set1++;
if(set1 > 2){
set1 = 0x01;
}
switch(set1){
case 0x01:
lcd.clear();
lcd.setCursor(0,1);
digitalWrite (LampRed, HIGH);
lcd.print("LED ROSSO ON");
break;
case 0x02:
lcd.clear();
lcd.setCursor(0,1);
digitalWrite (LampRed, LOW);
lcd.print("LED ROSSO OFF");
break;
}
}
}
void controlLed2(){
lcd.setCursor(0,0);
lcd.print("ACCENSIONE LED 2");
if(digitalRead(butP) == 0x00){
t_butP = 0x01;
}
if(digitalRead(butM) == 0x00){
t_butM = 0x01;
}
if(digitalRead(butP) && t_butP){
t_butP = 0x00;
set3++;
if(set3 > 2){
set3 = 0x01;
}
switch(set3){
case 0x01:
lcd.clear();
lcd.setCursor(0,1);
digitalWrite (LampRed2, HIGH);
lcd.print("LED VERDE ON");
break;
case 0x02:
lcd.clear();
lcd.setCursor(0,1);
digitalWrite (LampRed2, LOW);
lcd.print("LED VERDE OFF");
break;
}
}
}
void temperatura(){
reading = analogRead(sensorPin);
int celsius = reading/2;
lcd.setCursor(0, 0);
lcd.print("Temp interna ");
lcd.setCursor(0,1);
lcd.print(celsius, DEC);
lcd.print((char)223);
lcd.print("C");
}
void temperatura2(){
reading = analogRead(sensorPin2);
int celsius2 = reading/2;
lcd.setCursor(0, 0);
lcd.print("Temp esterna ");
lcd.setCursor(0,1);
lcd.print(celsius2, DEC);
lcd.print((char)223);
lcd.print("C");
}
void temperatura3(){
reading = analogRead(sensorPin3);
int celsius3 = reading/2;
lcd.setCursor(0, 0);
lcd.print("Temp sotto tetto");
lcd.setCursor(0,1);
lcd.print(celsius3, DEC);
lcd.print((char)223);
lcd.print("C");
}
void controlRele2(){
reading = analogRead(sensorPin2);
int celsius = reading/2;
lcd.setCursor(0, 0);
lcd.print("Temperatura: ");
lcd.setCursor(0,1);
lcd.print(celsius, DEC);
lcd.print((char)223);
lcd.print("C");
if (celsius >25) {
//modificare la temperatura desiderata,
//inserire > se attivo superiore a 28C°
//e < se attivo inferiore a 25C°
digitalWrite(7,HIGH);
lcd.print(" ON");
} else {
digitalWrite(7,LOW);
lcd.print(" OFF");
}
delay(500);
lcd.clear();
}
void controlRele(){
lcd.setCursor(0,0);
lcd.print("RELE");
if(digitalRead(butP) == 0x00){
t_butP = 0x01;
}
if(digitalRead(butM) == 0x00){
t_butM = 0x01;
}
if(digitalRead(butP) && t_butP){
t_butP = 0x00;
set2++;
if(set2 > 2){
set2 = 0x01;
}
switch(set2){
case 0x01:
lcd.clear();
lcd.setCursor(0,1);
digitalWrite (LampRele, LOW);
lcd.print("RELE ON");
break;
case 0x02:
lcd.clear();
lcd.setCursor(0,1);
digitalWrite (LampRele, HIGH);
lcd.print("RELE OFF");
break;
}
}
}
/*Ciclo per la funzione controllo Botola*/
void controlBotola(){
reading = analogRead(sensorPin);
int celsius = reading/2;
lcd.setCursor(0, 0);
lcd.print("Botola(22) In");
lcd.setCursor(10, 1);
lcd.print("Out");
lcd.setCursor(14, 0);
lcd.print(celsius, DEC);
delay (2000);
reading = analogRead(sensorPin2);
int celsius2 = reading/2;
lcd.setCursor(14, 1);
lcd.print(celsius2, DEC);
delay (2000);
if (celsius && celsius2 >=baseline_Temp) {
myservo.write(180);
delay(15);
lcd.setCursor(0,1);
lcd.print("aperta");
digitalWrite (LampGreen, HIGH);
digitalWrite (LampRed3, LOW);
//alarm();
}
else {
myservo.write(0);
delay(15);
lcd.setCursor(0,1);
digitalWrite (LampGreen, LOW);
digitalWrite (LampRed3, HIGH);
lcd.print("chiusa");
tone(4,400,500);
delay(500);
tone(4,650,500);
delay(500);
}
}