Oregelbunden utläsning till LCD samt procenträkning, Arduino

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Corpze
Inlägg: 256
Blev medlem: 29 januari 2013, 17:31:27

Oregelbunden utläsning till LCD samt procenträkning, Arduino

Inlägg av Corpze »

Hej igen, sitter och putsar till det sista på min kodning men har inte funnit någon lösning på ett ganska banalt problem egentligen...

Jag ska mäta ljus med hjälp av en sensor, jag vill trycka på min knapp (buttonSQM), inte hålla in den som jag måste idag, för att arduinon ska mäta ljuset och printa ut resultatet på min LCD.

allt fungerar kanon, förutom att jag måste hålla in knappen i 5-20 sek som mätningen kan ta beroende på ljusintesitet.

Tacksam för ideér :)

Såhär ser koden ut nu:

Kod: Markera allt

#include <FreqMeasure.h>
#include <Math.h>
#include <LiquidCrystal.h>

float Msqm;
const float A = 22.0;
int buttonSQM = A2;
int val = 0;
LiquidCrystal lcd (12, 11, 10, 9, 7, 6);

void setup() {
   Serial.begin(19200);
   FreqMeasure.begin();
   pinMode(buttonSQM, INPUT);
   digitalWrite(buttonSQM, HIGH);
   lcd.begin(16,2);
}

double sum=0;
int count=0;

void loop() {
   val = digitalRead(buttonSQM);
   if (val == LOW) {
   if (FreqMeasure.available()) {
    // average several reading together
   sum = sum + FreqMeasure.read();
   count = count + 1;
   if (count > 30) {
   double frequency = F_CPU / (sum / count);
   Serial.println(frequency);
   sum = 0;
   count = 0;

   Msqm = A - 2.5*log10(frequency); //Egen Kod
   Serial.print(Msqm);
   Serial.println(" Mag/Arcsecond2 ");
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.println("Mag/AS2:");
   lcd.setCursor(8,0);
   lcd.print(Msqm);
   delay(5000);
   lcd.clear();
}
}
}
}
Senast redigerad av Corpze 19 mars 2013, 00:29:44, redigerad totalt 2 gånger.
AndersL
EF Sponsor
Inlägg: 148
Blev medlem: 17 september 2004, 21:39:22
Ort: Ängelholm

Re: Slippa hålla in knapp, Arduino

Inlägg av AndersL »

Utan att ha satt mig in i koden skulle jag säga att man sätter en variabel när knappen trycks. Variabeln kontrolleras och om den är satt så mäter du ljusintensiteten. När mätningen är klar nollar du variabeln.
Användarvisningsbild
Klas-Kenny
Inlägg: 11841
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Slippa hålla in knapp, Arduino

Inlägg av Klas-Kenny »

Något sånt här borde fungera:

Kod: Markera allt

#include <FreqMeasure.h>
#include <Math.h>
#include <LiquidCrystal.h>

float Msqm;
const float A = 22.0;
int buttonSQM = A2;
int val = 0;
LiquidCrystal lcd (12, 11, 10, 9, 7, 6);
int reading = 0;                               //Variabel för flagga för läsning

void setup() {
   Serial.begin(19200);
   FreqMeasure.begin();
   pinMode(buttonSQM, INPUT);
   digitalWrite(buttonSQM, HIGH);
   lcd.begin(16,2);
}

double sum=0;
int count=0;

void loop() {
	val = digitalRead(buttonSQM);
	if (val == LOW) {
		reading = 1;                       //Sätt en flagga att knappen tryckts ned så att läsning pågår
		while(reading) {                      //Gör om det här så länge flaggan för läsning är satt
			if (FreqMeasure.available()) {
				// average several reading together
				sum = sum + FreqMeasure.read();
				count = count + 1;
				if (count > 30) {
					double frequency = F_CPU / (sum / count);
					Serial.println(frequency);
					sum = 0;
					count = 0;

					Msqm = A - 2.5*log10(frequency); //Egen Kod
					Serial.print(Msqm);
					Serial.println(" Mag/Arcsecond2 ");
					lcd.clear();
					lcd.setCursor(0,0);
					lcd.println("Mag/AS2:");
					lcd.setCursor(8,0);
					lcd.print(Msqm);
					delay(5000);
					lcd.clear();
					reading = 0;                    //Nolla flaggan för läsning och släpp ut ur while-loopen då läsning avslutats
				}
			}
		}
	}
}
Men snälla, tänk på indenteringen i fortsättningen. Var tvungen att fixa till det för att bli något klok alls.
Corpze
Inlägg: 256
Blev medlem: 29 januari 2013, 17:31:27

Re: Slippa hålla in knapp, Arduino

Inlägg av Corpze »

Ska tänka på indenteringen i fortsättningen och tusen tack, ska prova koden imorgon!
Corpze
Inlägg: 256
Blev medlem: 29 januari 2013, 17:31:27

Re: Slippa hålla in knapp, Arduino

Inlägg av Corpze »

Det fungerar jättebra nu, trots flera timmar igår med olika high´s, low´s if´s, while´s och but´s :shock:
Tusen tack för hjälpen! :tumupp:
Corpze
Inlägg: 256
Blev medlem: 29 januari 2013, 17:31:27

Re: Slippa hålla in knapp, Arduino

Inlägg av Corpze »

Om jag vill lägga till en extra (egentligen onödig funktion) som har till uppgift att printa ut till min lcd under tiden den tar in alla 31 counts, så jag vet hur långt den har kommit i mätningen (kan ta upp till en minut), skulle ja kunna skriva nåt sånt här:

Kod: Markera allt

void loop() {
   val = digitalRead(buttonSQM);
   if (val == LOW) {
      reading = 1;                       //Sätt en flagga att knappen tryckts ned så att läsning pågår
      while(reading) {                      //Gör om det här så länge flaggan för läsning är satt
         if (FreqMeasure.available()) {
            // average several reading together
            sum = sum + FreqMeasure.read();
            count = count + 1;
            if (count > 30) {
               double frequency = F_CPU / (sum / count);
               lcd.clear();
               lcd.setCursor(0,0);
               lcd.println("Reading");
               lcd.setCursor(9,0);
               lcd.print(count);
               sum = 0;
               count = 0;

               Msqm = A - 2.5*log10(frequency); //Egen Kod
               Serial.print(Msqm);
               Serial.println(" Mag/Arcsecond2 ");
               lcd.clear();
               lcd.setCursor(0,0);
               lcd.println("Mag/AS2:");
               lcd.setCursor(8,0);
               lcd.print(Msqm);
               delay(5000);
               lcd.clear();
               reading = 0;                    //Nolla flaggan för läsning och släpp ut ur while-loopen då läsning avslutats
            }
         }
      }
   }
}
Användarvisningsbild
Klas-Kenny
Inlägg: 11841
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Slippa hålla in knapp, Arduino

Inlägg av Klas-Kenny »

Flytta koden för att skriva det till precis under count = count + 1; istället. Som det är nu kommer den ju bara skriva steget när den kommit upp till över 30.
Corpze
Inlägg: 256
Blev medlem: 29 januari 2013, 17:31:27

Re: Slippa hålla in knapp, Arduino

Inlägg av Corpze »

Nu skriver den ut count, men jag får några konstiga streck mellan "Reading" och själva "count'en" och de försvinner inte om jag sätter "cursorn" på varken 7,8 eller 9 teckenet på rad "0"... vad kan det vara för nåt?

Sedan så verkar det som att den räknar om och om igen, även om jag inte trycker ner knappen. Först när jag trycker ner knappen så visar den på LCD'n var i räkningen den är... Jag vill inte "ödlsa" CPU och därmed batteri på att koden rullar om och om igen... jag vill bara initiera koden först när jag trycker på min knapp...
Ni ser även vilken skilnad det är i tid att räkna 30 pulser med en liten glipa för ljuset i lådan där sensorn är, jämfört med om det är en helt stängd låda... (i princip helt kolsvart)

Jag filmade en snutt för att visa vad jag menar:

Corpze
Inlägg: 256
Blev medlem: 29 januari 2013, 17:31:27

Re: Slippa hålla in knapp, Arduino, konstiga tecken i LCD (V

Inlägg av Corpze »

Nu har jag löst de konstiga tecknen iaf, bytte från println till print enbart...
Går det på nåt smidigt vis att lägga till en"progress-bar" med ifyllda rutor på lcdn och visning i procent (0-100) istället för att den räknar till 31 counts?
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Re: Slippa hålla in knapp, Arduino, konstiga tecken i LCD (V

Inlägg av PHermansson »

println lägger till "ny rad" för utskrift på serieporten, blir nog fel på LCD:n som du kommit på. En progress bar ska gå att göra med lite trix, http://www.electronicsblog.net/arduino- ... haracters/.
Corpze
Inlägg: 256
Blev medlem: 29 januari 2013, 17:31:27

Re: Slippa hålla in knapp, Arduino, konstiga tecken i LCD (V

Inlägg av Corpze »

Har ett annat problem som jag inte råder bot på... När jag trycker ner knappen för att initiera en mätning räknar den från 1-31 med ca en sekunds mellanrum mellan varje "count", efter det visar den resultatet på lcdn, allt fungerar med andra ord som det ska.

Om jag trycker på knappen för att göra en ny mätning så printar den ut räkningen från 11-31 på lcdn, medans i serial-monitorn så räknar den från 1-31, men de första 1-11 "counts'en" räknar den jättesnabbt, kanske på en halvsekund, för att räkna med vanlig takt från 11-31. Vad kan detta vara för nåt fuffens?

Edit... jag fann i freqmeasure.h att det finns ett kommando som heter freqMeasure.end();
det kanske får stopp på mätningen efter att den mätt en gång?
Här är iaf hemsidan om freqMeasure: http://www.pjrc.com/teensy/td_libs_FreqMeasure.html

Jag skrev om koden lite för att räkna ut procent också men formeln verkar inte fungera... formeln blev såhär iaf: percentage = count/31*100 vet dock inte om den blir rätt...

Kod: Markera allt

#include <FreqMeasure.h>
#include <Math.h>
#include <LiquidCrystal.h>

float Msqm;
const float A = 22.0;
int buttonSQM = A2; 
int val = 0;
int reading = 0;
int percentage = 0;
LiquidCrystal lcd (12, 11, 10, 9, 7, 6);


void setup() {
   FreqMeasure.begin();
   pinMode(buttonSQM, INPUT_PULLUP);
   digitalWrite(buttonSQM, HIGH);
   lcd.begin(16,2);
   Serial.begin(19200);
}

double sum=0;
int count=0;

void loop() {
  val = digitalRead(buttonSQM);
   if (val == LOW) {
      reading = 1;                       
      while(reading) {                     
         if (FreqMeasure.available()) {
            // average several reading together
            sum = sum + FreqMeasure.read();
            count +=1;
            lcd.clear();
            lcd.setCursor(0,0);
            lcd.print("Reading");
            lcd.setCursor(8,0);
            lcd.print(count);
            
            percentage = count/31*100;
            Serial.print(count);
            Serial.print("Counts  ");
            Serial.println(percentage);
            
            if (count > 30) {
               double frequency = F_CPU / (sum / count);
               sum = 0;
               count = 0;
               
               Msqm = A - 2.5*log10(frequency); //Egen Kod
               lcd.clear();
               lcd.setCursor(0,0);
               lcd.println("Mag/As2:");
               lcd.setCursor(8,0);
               lcd.print(Msqm);
               delay(5000);
               lcd.clear();
               reading = 0;                   
            }
         }
      }
   }
}
Corpze
Inlägg: 256
Blev medlem: 29 januari 2013, 17:31:27

Re: Oregelbunden utläsning till LCD samt procenträkning, Ard

Inlägg av Corpze »

Nu fungerar det perfekt, den läser först när jag trycker på knappen, håller inga värden i bufferten (den höll 12 mätningar i bufferten, därav den snabba counten i början) samt printar ut hur många procent av mätningen som gjorts på lcdn!

Kod: Markera allt

#include <FreqMeasure.h>
#include <Math.h>
#include <LiquidCrystal.h>

float Msqm;
const float A = 22.0;
int buttonSQM = A2; 
int val = 0;
int reading = 0;
int percentage = 0;
LiquidCrystal lcd (12, 11, 10, 9, 7, 6);


void setup() {
   
   pinMode(buttonSQM, INPUT_PULLUP);
   digitalWrite(buttonSQM, HIGH);
   lcd.begin(16,2);
   Serial.begin(19200);
}

double sum=0;
int count=0;

void loop() {
  val = digitalRead(buttonSQM);
   if (val == LOW) {
      reading = 1;
      FreqMeasure.begin();      
      while(reading) {
                 
         if (FreqMeasure.available()) {
            // average several reading together
            sum = sum + FreqMeasure.read();
            count +=1;
            lcd.clear();
            lcd.setCursor(0,0);
            lcd.print("Reading");
            lcd.setCursor(8,0);
            lcd.print(percentage);
            lcd.setCursor(11,0);
            lcd.print("%");
            
            percentage = count/31.0*100.0;

            Serial.print("Counts: ");
            Serial.print(count); 
            Serial.print(" Progress: ");           
            Serial.print(percentage);
            Serial.println("%");
            
            
            if (count > 30) {
               double frequency = F_CPU / (sum / count);
               sum = 0;
               count = 0;
               
               Msqm = A - 2.5*log10(frequency); //Frequency to magnitudes/arcSecond2 formula
                
               lcd.clear();
               lcd.setCursor(0,0);
               lcd.println("Mag/As2: ");
               lcd.setCursor(9,0);
               lcd.print(Msqm);
               Serial.print(Msqm);
               delay(5000);
               lcd.clear();
               reading = 0; 
               FreqMeasure.end();
            }
         }
      }
   }
}
Skriv svar