Val av mikroprocessor till husvagnsprojekt

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
östergren
Inlägg: 42
Blev medlem: 7 oktober 2012, 12:57:49

Re: Val av mikroprocessor till husvagnsprojekt

Inlägg av östergren »

Ä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?

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);
}
Användarvisningsbild
Bosen
Inlägg: 1753
Blev medlem: 18 juli 2005, 10:56:31
Ort: Karl Gustav, Varberg
Kontakt:

Re: Val av mikroprocessor till husvagnsprojekt

Inlägg av Bosen »

Du ska aldrig ha oanslutna ingångar. Testa att sätta fom som utgångar istället.
ToPNoTCH
Inlägg: 5151
Blev medlem: 21 december 2009, 17:59:48

Re: Val av mikroprocessor till husvagnsprojekt

Inlägg av ToPNoTCH »

Kanske inte spelar roll ,men när jag mappar kontanter mot pinnar så skriver jag ut "A3" om det är den analoga 3'an jag vill nyttja.
I ditt fall har du skrivit "3". Jag trorinte det gör skillnad för jag gissar att analoga operationer förutsätter att man avser en analog pinne och tolkar "3" till "A3" själv.

Men det kan vara värt att testa och om inte annat blir det tydligare i koden.

Sedan fattar jag inte varför dun inte sätter alla pin-definitioner som konstanter i stället för variabler, men det är mer kuriosa.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Val av mikroprocessor till husvagnsprojekt

Inlägg av sodjan »

Det är ju flera hundra rader kod!
Det borde räcka med ett par tiotal rader för att visa
på problemet. Gör ett kort test-case som visar
problemet så blir det lättare att läsa.
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Val av mikroprocessor till husvagnsprojekt

Inlägg av Icecap »

Floats och allt... ett mycket typisk exempel på hur man inte ska göra, iaf. i mina ögon.

Men till problemet: ingen ingång får vara fritt flytande, används en ingång inte som analog ingång ska den vara ställd till digital funktion och då gärna utgång om det passar eller om den är oanvänd.

Programmeringen ser i övrigt ut som att en systemvetare har hoppat på en mikroprocessor utan att förstå något om resurser och funktionssätt.
östergren
Inlägg: 42
Blev medlem: 7 oktober 2012, 12:57:49

Re: Val av mikroprocessor till husvagnsprojekt

Inlägg av östergren »

ToPNoTCH skrev:Kanske inte spelar roll ,men när jag mappar kontanter mot pinnar så skriver jag ut "A3" om det är den analoga 3'an jag vill nyttja.
I ditt fall har du skrivit "3". Jag trorinte det gör skillnad för jag gissar att analoga operationer förutsätter att man avser en analog pinne och tolkar "3" till "A3" själv.

Men det kan vara värt att testa och om inte annat blir det tydligare i koden.

Sedan fattar jag inte varför dun inte sätter alla pin-definitioner som konstanter i stället för variabler, men det är mer kuriosa.


Jag testade det nu men det hjälpte dessvärre mig inte med problemet. Dock var det en god tanke :)
sodjan skrev:Det är ju flera hundra rader kod!
Det borde räcka med ett par tiotal rader för att visa
på problemet. Gör ett kort test-case som visar
problemet så blir det lättare att läsa.
Jag ska se om jag inte kan skriva ihop en liten snutt som bara ser själva problemet istället. Men hur funkar det, alla kopplingar som jag har gjort. Måste jag slita ur dom då eller kan dom hänga kvar? Fast pins:en inte är konfigurerade? För att testa ju den ingången som strular.



Icecap, grejen är ju den att detta är överhuvudtaget mitt första projekt med en mikroprocessor. Att koden inte skulle bli perfekt kan jag nog förstå :) Däremot så försöker jag läsa mig till så mycket jag kan på nätet. Men ibland blir det att man går omvägar..
Men saken är den att jag använder alla analoga ingångar som det är just nu, måste man konfigurera dom digitala in/ut-gångarna till utgångar om dom inte används? Kan det vara svaret på mitt bekymmer?
Behöver man säga att den tex A1 skall vara en ingång? Det har jag ju egentligen inte gjort i min kod, men den kan väl heller inte vara annat än en ingång?
ToPNoTCH
Inlägg: 5151
Blev medlem: 21 december 2009, 17:59:48

Re: Val av mikroprocessor till husvagnsprojekt

Inlägg av ToPNoTCH »

Det kostar ju inget att prova.

Använd

Kod: Markera allt

pinMode(X,INPUT_PULLUP);
På oanvända pinnar.

Du kan även sätta dom som input och sedan sätta dom som high, vilket även det applicerar interna pullups i praktiken, men koden ovan gör exakt detta men i en enda rad.

Jag levde i tron att "analogRead" automagiskt satte pinnen som input, precis "som analogWrite" alltid gör den till output.
Men faktum är att det står inget om detta. Vad jag vill minnas har jag aldrig behövt sätta den som input för att läsa analogt.

Att de analoga portarna inte kan vara annat än ingång är en missuppfattning.
Det går alldeles utmärkt att definera dom som digitala och använda dom som sådana.

Ett talande exempel är ju att A4 & A5 är de pinnarna som används för hårvarans I2C och det är ju i högsta grad digitalt och både in/ut.

Och du...
Ta inte illa upp när gubbarna klagar på dig.
Sodjan brukar gnälla när folk klipper ut delar ur koden normalt, men denna gång var det tydligen fel åt andra hållet.
IceCap har nog inte fattat att det är en husvagnsägare som kodar för först gången i en MCU.

Extremt duktiga snubbar som man lär mycket av och betalningen är lite offentlig nedvärdering. Bara skaka av sig det är ett bra byte ändå :lol:
Användarvisningsbild
SeniorLemuren
Inlägg: 8427
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Val av mikroprocessor till husvagnsprojekt

Inlägg av SeniorLemuren »

östergren skrev:Men saken är den att jag använder alla analoga ingångar som det är just nu,
Ett litet tips för framtiden. Använd MAX18B20 digitala tempgivare nästa gång, så kan du hänga på så många givare du vill på bara en port och frigöra alla analoga ingångar. :)
östergren
Inlägg: 42
Blev medlem: 7 oktober 2012, 12:57:49

Re: Val av mikroprocessor till husvagnsprojekt

Inlägg av östergren »

Hehe, lite offentlig förnedring kan jag leva med om man lär sig något bara.
Hade jag inte klarat det så ska man heller inte fråga :D

Jag testade nu att sätta den interna pull-up:en på oanvända pinnar tyvärr utan större resultat. Men det är inte fel att ha det satt iaf. Kanske undviker det ett problem i framtiden.
Däremot så har jag läst runt lite på nätet om problem med tempgivare som ger "fladdriga" värden. Det ska tydligen bero på att just LM35 har väldigt hög impedans och spänningen hinner inte riktigt stabilisera sig mellan looparna.
Jag hittade det här, lösningen finns på tredje inlägget..

Jag valde då att testa detta genom att skriva såhär:

Kod: Markera allt

//----------Tempmätning panna---------------------        
      {
      if (maxmindelay >2)  //Väntar 2sek efter uppstart för att givarna ska stabilisera sig, max-min registering
          { 
          delay(10);  
          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
          }
      }
Funkade inte.. Tänker jag fel?



Inte dumt allt SeniorLemuren, dock verkar den ju inte vara den lättaste att hitta så man kan köpa den eller läsa om den. Är du säker på att du har skrivit rätt beteckning, MAX18B20? :)
eqlazer
Inlägg: 923
Blev medlem: 22 september 2007, 13:53:45
Ort: Göteborg

Re: Val av mikroprocessor till husvagnsprojekt

Inlägg av eqlazer »

Den heter DS18B20, en "Dallas-sensor" tillverkad av Maxim.
Användarvisningsbild
SeniorLemuren
Inlägg: 8427
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Val av mikroprocessor till husvagnsprojekt

Inlägg av SeniorLemuren »

Ok, hade lite brådis mellan 2 backar öl när jag skrev inlägget. :) DS18B20 är ju naturligtvis rätt beteckning. Jag har just nu 4 stycken anslutna till en port på en PIC för mätning av temperaturer på olika ställen i båten. Det funkar perfekt. Stadiga värden utan flutter.
Den kan fås som gratisprov (max 2 st) från Maxim. Eller du kan säkert köpa några här på forumet om du efterlyser.
östergren
Inlägg: 42
Blev medlem: 7 oktober 2012, 12:57:49

Re: Val av mikroprocessor till husvagnsprojekt

Inlägg av östergren »

Hehe, helt rätt. Man ska inte låta ölen stå och bli varm 8)
Men jag ska överväga om jag inte ska använda den typen istället om jag inte får någon ordning på dom jag har. Hur många givare kan man ansluta till en port egentligen?
östergren
Inlägg: 42
Blev medlem: 7 oktober 2012, 12:57:49

Re: Val av mikroprocessor till husvagnsprojekt

Inlägg av östergren »

Nu fick jag till det, det som man var tvungen att göra var att läsa den analoga pin:en lägga en fördröjning och sedan läsa av den igen för att få ett stabilt värde. Så koden blir typ såhär:

Kod: Markera allt

 analogRead(temppin1);  
          delay(15);
          tempc2 = ( 5.0 * analogRead(temppin2) * 100.0) / 1024.0;
Ifall någon annan har samma problem :)
Användarvisningsbild
SeniorLemuren
Inlägg: 8427
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Val av mikroprocessor till husvagnsprojekt

Inlägg av SeniorLemuren »

Alla givare har ett unikt 48-bitars serienummer som man adresserar, så det kan bli några stycken. :)

Edit. Funktionen är den att man sänder reset på porten och därefter det unika serinumret till den givare man vill avläsa. Givaren öppnas då för kommunikation och de andra givarna avvaktar ny reset.

För att få reda på serienumret på en givare så kopplar man enklast in givaren ensam till porten och läser av dess serienummer, som man sedan använder för att nå givaren i nätet. Det går att läsa in samtliga serienummer i ett nät också, men det är en krångligare lösning.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Val av mikroprocessor till husvagnsprojekt

Inlägg av sodjan »

> det som man var tvungen att göra var att läsa den analoga pin:en lägga en
> fördröjning och sedan läsa av den igen för att få ett stabilt värde.

I koden som följer det så använder du två olika pinnar (tror jag, eller är
temppin1 och temppin2 samma pinne?). När du säger "läsa av den ingen",
menar du inte då *samma* pinne? Och i så fall, hur visar koden just det?

Sen så är det så att när man byter "kanal" mellan olika ADC ingångar så
behöver processorn en liten tid på sig att stabilisera sig innan man kan
starta en konverteringer.

Nu sp kan man tycka att detta borde hanteras internt i analogRead()
funktionen, speciellt om det inte finns seprata funktioner för att dels
välja kanal, dels starta konvertering, d.v.s så att man själv kan göra
den nödvändiga fördröjningen.

Men som sagt, jag är inte helt med på hur koden visar "lösningen"... :-)
Skriv svar