Sida 1 av 1

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

Postat: 14 mars 2013, 21:27:02
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();
}
}
}
}

Re: Slippa hålla in knapp, Arduino

Postat: 14 mars 2013, 21:36:34
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.

Re: Slippa hålla in knapp, Arduino

Postat: 14 mars 2013, 23:09:02
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.

Re: Slippa hålla in knapp, Arduino

Postat: 14 mars 2013, 23:52:40
av Corpze
Ska tänka på indenteringen i fortsättningen och tusen tack, ska prova koden imorgon!

Re: Slippa hålla in knapp, Arduino

Postat: 15 mars 2013, 08:05:19
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:

Re: Slippa hålla in knapp, Arduino

Postat: 15 mars 2013, 11:09:43
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
            }
         }
      }
   }
}

Re: Slippa hålla in knapp, Arduino

Postat: 15 mars 2013, 13:37:27
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.

Re: Slippa hålla in knapp, Arduino

Postat: 17 mars 2013, 14:52:00
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:


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

Postat: 18 mars 2013, 13:17:27
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?

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

Postat: 18 mars 2013, 19:51:04
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/.

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

Postat: 18 mars 2013, 20:47:50
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;                   
            }
         }
      }
   }
}

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

Postat: 19 mars 2013, 16:25:59
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();
            }
         }
      }
   }
}