Re: Val av mikroprocessor till husvagnsprojekt
Postat: 10 december 2012, 18:37:17
Är det någon som vet om en oansluten analogingång kan störa ut en annan? Låter helt otroligt men jag vet inte vad felet är snart. Jag har tre st tempgivare som jag har anslutna. På A1, A2 & A3. A1 & A2 Funkar hur bra somhelst, visar 20c stabilt. Medan den som går in på ingång A3 bläddrar mellan 17-26c.. Mindre bra med andra ord.
Givaren jag använder heter LM35DZ och har bra stabil spänning ut (ca 220mV).
Om jag tar en givare och flyttar mellan A1,2 & 3 så är det bara på 3:an som det blir inkorrekt visning. Koden jag använder mig av är identisk för visningen. Bifogar den ifall att det kanske är något jag har missat i den?
Givaren jag använder heter LM35DZ och har bra stabil spänning ut (ca 220mV).
Om jag tar en givare och flyttar mellan A1,2 & 3 så är det bara på 3:an som det blir inkorrekt visning. Koden jag använder mig av är identisk för visningen. Bifogar den ifall att det kanske är något jag har missat i den?
Kod: Markera allt
#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,5,4,3,2); // pins som led är ansluten till
const int buttonPin = 11; // pin som menyknapp upp är ansluten till
const int buttonPin1 = 12; // pin som menyknapp ner är ansluten till
const int ledpin =13; // Pin13, led
const int backpin =10; // Pin10, styrning av bakgrundsbelysning
// Variabler
//Menyknappar
int buttonPushCounter = 1; // räknare för antal knapptryck
int buttonState11 = 0; // tillfällig knappstatus, upp
int buttonState12 = 0; // tillfällig knappstatus, ner
int lastButtonState = 0; // föregående status på knapp
//Lcd belysningstyrning
int lcdbacklight=0; //variabel för lcd bakgrundbel
//Tid sedan reset
int second=0; //Variabel för sekunder
int minute=0; //Variabel för minuter
int hour=0; //Variabel för timmar
int day=0; //Variabel för dagar
//Temp visning panna
int temppin1 = 3; // Pin som givare är ansluten till
int tempc1 = 0; // temperatur variabel panna
int samples1[8]; // variabel för bättre precision
int maxi1 = -100,mini1 = 100; // start max/min temperatur panna
//Temp visning varmvatten
int temppin2 = 2; // Pin som givare är ansluten till
int tempc2 = 0; // temperatur variabel panna
int samples2[8]; // variabel för bättre precision
int maxi2 = -100,mini2 = 100; // start max/min temperatur varmvatten
//Temp visning lufttemp
int temppin3 = 1; // Pin som givare är ansluten till
int tempc3 = 0; // temperatur variabel panna
int samples3[8]; // variabel för bättre precision
int maxi3 = -100,mini3 = 100; // start max/min temperatur innetemp
//Fördröjning av max & min registrering
int maxmindelay = 0;
//Strömförbrukning
int VRaw; // För att spara rå-data
int IRaw;
float VFinal; // För att spara konverterad data
float IFinal;
float WFinal;
//Vattennivå
int waterlevel = 0;
int value = 0; // Val av ingång som skall läsas av
void setup() {
digitalWrite(backpin, HIGH);
pinMode(buttonPin, INPUT); //Val av ingång
pinMode(buttonPin1, INPUT); //Val av ingång
pinMode(ledpin, OUTPUT); //Val av utgång
pinMode(backpin, OUTPUT); //Val av utgång
lcd.begin(16,2); //Text som visas vid uppstart
lcd.print(" KABE 590 XL ");
lcd.setCursor(0,1);
lcd.print("2013 V1.6");
delay(3000);
lcd.clear();
}
void loop() {
//-----------Kod för variabel "tid sedan reset"-------------
static unsigned long lastTick = 0; // Sätter upp en variabel som kommer ihåg sista gången det flyttades en sekund, mellan looparna
//----------------Kod för att menystyrning---------------
buttonState11 = digitalRead(buttonPin); // Läser av knapp upp status
if (buttonState11 != lastButtonState) // Jämnför om det är förändring mot föregående loop
{
if (buttonState11 == LOW) // Om den är förändrad, skall räknaren öka med 1
{
buttonPushCounter +=1;
lcdbacklight=0; // Nollar timer till bakgrundbelysning vid knapptryck
delay(50);
}
}
lastButtonState = buttonState11; //Spara knappstatus för att kunna jämnföra vid nästa loop
buttonState12 = digitalRead(buttonPin1); // Läser av knapp ner status
if (buttonState12 != lastButtonState) // Jämnför om det är förändring mot föregående loop
{
if (buttonState12 == LOW) // Om den är förändrad, skall räknaren minska med 1
{
buttonPushCounter-=1;
lcdbacklight=0; // Nollar timer till bakgrundbelysning vid knapptryck
delay(50);
}
if (buttonPushCounter ==0) //Flyttar till meny 3
{
(buttonPushCounter =6);
delay(50);
}
lastButtonState = buttonState12; //Spara knappstatus för att kunna jämnföra vid nästa loop
}
//---------Styrning av bakgrundbelysning LCD----------
{
if (lcdbacklight < 300)
{
digitalWrite(backpin, HIGH);
}
else if (lcdbacklight >= 300)
{
digitalWrite(backpin, LOW);
}
}
//----------Tempmätning panna---------------------
{
if (maxmindelay >2) //Väntar 2sek efter uppstart för att givarna ska stabilisera sig
{
tempc1 = ( 5.0 * analogRead(temppin1) * 100.0) / 1024.0;
if(tempc1 > maxi1) {maxi1 = tempc1;} // Sätter max temp-panna
if(tempc1 < mini1) {mini1 = tempc1;} // Sätter min temp-panna
}
}
//----------Tempmätning varmvatten---------------------
{
if (maxmindelay >2) //Väntar 2sek efter uppstart för att givarna ska stabilisera sig
{
tempc2 = ( 5.0 * analogRead(temppin2) * 100.0) / 1024.0;
if(tempc2 > maxi2) {maxi2 = tempc2;} // Sätter max varmvatten
if(tempc2 < mini2) {mini2 = tempc2;} // Sätter min varmvatten
}
}
//----------Tempmätning lufttemp---------------------
{
if (maxmindelay >2) //Väntar 2sek efter uppstart för att givarna ska stabilisera sig
{
tempc3 = ( 5.0 * analogRead(temppin3) * 100.0) / 1024.0;
if(tempc3 > maxi3) {maxi3 = tempc3;} // Sätter max lufttemp
if(tempc3 < mini3) {mini3 = tempc3;} // Sätter min lufttemp
}
}
//------Kod för att uppdatera Led för vattennivå kontinuerligt------
int value = analogRead(0); // Val av ingång som skall läsas av
if (value>340)digitalWrite(ledpin, HIGH); //Tänder diod på pin13 om analogt värde understiger 205 eller 10liter
if (value<340)digitalWrite(ledpin, LOW); //Släcker diod på pin13 om analogt värde överstiger 205 eller 10liter
//------------------Kod för visning av vattennivå--------------------
if (value >395) //Verklig värde, 0L - 402
{waterlevel = 0;}
if (value <395) //Verklig värde, 5L - 376
{waterlevel = 5;}
if (value <370) //Verklig värde, 10L - 350
{waterlevel = 10;}
if (value <345) //Verklig värde, 15L - 320
{waterlevel = 15;}
if (value <315) //Verklig värde, 20L - 286
{waterlevel = 20;}
if (value <280) //Verklig värde, 25L - 250
{waterlevel = 25;}
if (value <245) //Verklig värde, 30L - 210
{waterlevel = 30;}
if (value <205) //Verklig värde, 35L - 166
{waterlevel = 35;}
if (value <160) //Verklig värde, 40L - 117
{waterlevel = 40;}
if (value <110) //Verklig värde, 45L - 61
{waterlevel = 45;}
if (value <50) //Verklig värde, 50L - 0
{waterlevel = 50;}
//-----Kod för att uppdatera "timer sedan reset" kontinuerligt--------
{
// Flyttar fran en sekund varje 1000 millisekunder
if (millis() - lastTick >= 1000) {
lastTick = millis();
second++;
lcdbacklight++; //Öka timern till bakgrundsbelysning med en sekund
maxmindelay++; //Timer för fördröjning av max/min registrering temp
}
// Flyttar fram en minut var 60:e sekund
if (second > 59) {
minute++;
second = 0; // reset sekunder till 0
}
// Flyttar fram en timme var 60:e minut
if (minute > 59) {
hour++;
minute = 0; // reset minuter till 0
}
// Flyttar fram en dag var 24:e timme
if (hour > 23) {
day++;
hour = 0; // reset timmar till 0
}
}
//---------------Meny 1 Vattennivå-------------------
if (buttonPushCounter ==1)
{
//Kod för mätning av vattennivå
lcd.clear(); //Rensar LCD från tidigare text
lcd.print("Water level:"); // Text som visas på rad 1
lcd.setCursor(0,1);
lcd.print(waterlevel); //Avläsnining av värdet från vald ingång, skalning av visning
lcd.setCursor(4,1);
lcd.print ("Liter"); // Textrad efter analogt värde
}
//------------------Meny 2 Temperaturmätning panntemp----------------------
if (buttonPushCounter ==2)
{
lcd.clear();
lcd.print(tempc1,DEC);
lcd.print(" Celsius");
lcd.setCursor(0,1);
lcd.print(maxi1,DEC);
lcd.print(" Max");
lcd.setCursor(8,1);
lcd.print(mini1,DEC);
lcd.print(" Min");
tempc1 = 0;
delay(50);
}
//------------------Meny 3 Temperaturmätning varmvatten----------------------
if (buttonPushCounter ==3)
{
lcd.clear();
lcd.print(tempc2,DEC);
lcd.print(" Celsius");
lcd.setCursor(0,1);
lcd.print(maxi2,DEC);
lcd.print(" Max");
lcd.setCursor(8,1);
lcd.print(mini2,DEC);
lcd.print(" Min");
tempc2 = 0;
delay(50);
}
//------------------Meny 4 Temperaturmätning Luft----------------------
if (buttonPushCounter ==4)
{
lcd.clear();
lcd.print(tempc3,DEC);
lcd.print(" Celsius");
lcd.setCursor(0,1);
lcd.print(maxi3,DEC);
lcd.print(" Max");
lcd.setCursor(8,1);
lcd.print(mini3,DEC);
lcd.print(" Min");
tempc3 = 0;
delay(50);
}
//-----------------Meny 5 Strömförbrukning----------------------------
if (buttonPushCounter ==5)
{
VRaw = analogRead(A4); //Val av ingångar som läses av
IRaw = analogRead(A5);
VFinal = VRaw/12.99; // Omvandling av rå-data
IFinal = IRaw/7.4;
WFinal = VFinal*IFinal;
lcd.clear();
lcd.print(VFinal);
lcd.print("Volts ");
lcd.print(WFinal);
lcd.print("Watt");
lcd.setCursor(0,1);
lcd.print(IFinal);
lcd.print("Ampere");
delay(50);
}
//-----------------Meny 6 tid sedan reset----------------------------
if (buttonPushCounter ==6)
{
lcd.clear();
lcd.setCursor(0,0); //Första förklarande textrad
lcd.print("Dag");
lcd.setCursor(4,0);
lcd.print("Tim");
lcd.setCursor(8,0);
lcd.print("Min");
lcd.setCursor(12,0);
lcd.print("Sek");
lcd.setCursor(0,1); //Andra raden med variabler
lcd.print(day);
lcd.setCursor(4,1);
lcd.print(hour);
lcd.setCursor(8,1);
lcd.print(minute);
lcd.setCursor(12,1);
lcd.print(second);
delay(50);
}
//-----------Flyttar till meny 1------------
if (buttonPushCounter ==7) ///Flyttar till meny 1
{
lcd.clear();
(buttonPushCounter =1);
delay(50);
}
delay(150);
}