Sida 1 av 1

Kört fast i C++ (Arduino)

Postat: 24 november 2016, 13:32:09
av Corpze
Hej, jag håller på att bygga en ljusmätare, den skall aktiveras med antingen en fysisk knapp eller via ett kommande via seriell kommunikation.

Just nu har jag bara lyckats skriva koden så den fungerar med den fysiska knappen;

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);
byte byteRead;


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();
            }
         }
      }
   }
}

Det jag vill ha in är att jag via att skriva te.x "GetSQM" i serial monitor och får en utläsning.

Det jag har kört fast på är "or"
alltså, när jag trycker på den fysiska knappen "Eller" skriver kommando i monitor ---> kör mätningen...
Någon som kan ge en pointer?

/MVH

Re: Kört fast i C++ (Arduino)

Postat: 24 november 2016, 14:35:44
av johano
Helt otestat och ur "huvet", men nåt sånthär kanske kan vara en början:

Kod: Markera allt


String getCommand()
{
	if(Serial.available()) 
		return Serial.readStringUntil('\n').trim();
	
	return null;
}

String cmd;

...
void loop() {
  cmd = getCommand();
  val = digitalRead(buttonSQM);
   if (val == LOW || "GetSQM"==cmd) {

   ...
   
   }

Re: Kört fast i C++ (Arduino)

Postat: 24 november 2016, 16:55:14
av Corpze
Hmm... det funkade inte alls, arduinoprogrammet kan inte tolka return Serial.readStringUntil('\n').trim();

- could not convert 'Stream::readStringUntil(char)('\012').String::trim()' from 'void' to 'String'

Vad gör den kodsnutten? har inte sett något liknanade tidigare.
Ska jag

Re: Kört fast i C++ (Arduino)

Postat: 24 november 2016, 17:28:17
av SeniorLemuren
Varför kollar du inte på de exempel som finns i Arduino IDE. Där finns flera exempel på hur du gör under 04.Communication.

Re: Kört fast i C++ (Arduino)

Postat: 24 november 2016, 17:44:28
av Corpze
Tack för tipset, men jag blir tyvärr inte klokare, jag har läst och letat i timmar efter hur man använder "OR" i kod, i teorin är det ju skitenkelt, jag vill köra kodsnutten om en knapp trycks in eller (OR) kommandot "GetSQM" skrivs in i serial maonitorn.

Jag får inte till det med or i denna koden, kanske är helt fel också?

Kod: Markera allt

void loop() {
  while (Serial.available()) {
    if (Serial.read() == "GetSQM");
    or val = digitalRead(buttonSQM);
    (val == LOW) {
     
{
      reading = 1;
      FreqMeasure.begin();      
      while(reading) {

Re: Kört fast i C++ (Arduino)

Postat: 24 november 2016, 17:58:04
av Borre
Kolla här, andra exemplet med or ||:
https://www.arduino.cc/en/Reference/Boolean

Kolla in den här också, referenser och exempel på allt möjligt:
https://www.arduino.cc/en/Reference/HomePage

Re: Kört fast i C++ (Arduino)

Postat: 24 november 2016, 18:03:35
av Skogen
utan att ha provat, men nåt liknande

Kod: Markera allt

if ((Serial.read() == "GetSQM") or (digitalRead(buttonSQM) == LOW)) {

Re: Kört fast i C++ (Arduino)

Postat: 24 november 2016, 18:28:31
av janno
Nu har jag nästan aldrig skrivit Arduino kod, men det är väl mest C/C++ så då används (som Borre skriver) "||" alltså dubbelt | -tecken för att göra or jämförelser.
Så för att if satsen ska utföra något vid antingen a eller b som sant så skriver man:

Kod: Markera allt


boolean a = Serial.read() == "GetSQM";  //Kan man göra strängjämförelse så här i Arduino?
boolean b = digitalRead(buttonSQM) == LOW;

if(a||b)
{
   //Kod som ska köras när a eller b är sant.
}
De olika operatorerna kan man läsa om här: https://www.arduino.cc/en/Reference/Boolean

Re: Kört fast i C++ (Arduino)

Postat: 24 november 2016, 19:13:40
av Corpze
Nu verkar knappen att fungera som den ska, men nu får jag ju inte "GetSQM" att funka när jag skickar det via Serial monitorn, jag har helt tappat bort mig vilken deklarering jag skall ha för "GetSQM" för att den skall köra koden :doh:

Har provat att ange den som byte, char och int, inget funkar :P

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);
byte GetSQM;



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

double sum=0;
int count=0;

void loop() {
  
    if ((Serial.read() == "GetSQM") or (digitalRead(buttonSQM) == 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(" 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();
            }
         }
      }
}   }

Re: Kört fast i C++ (Arduino)

Postat: 24 november 2016, 19:16:41
av johano
Corpze skrev:Hmm... det funkade inte alls, arduinoprogrammet kan inte tolka return Serial.readStringUntil('\n').trim();

- could not convert 'Stream::readStringUntil(char)('\012').String::trim()' from 'void' to 'String'

Vad gör den kodsnutten? har inte sett något liknanade tidigare.
Ska jag
Ah, slarvigt :doh:

String.trim() returnerar inte strängen tillbaka utan gör trimningen "in-place",
Såhär kanske då:

Kod: Markera allt

String getCommand()
{
   if(Serial.available()) {
      String c = Serial.readStringUntil('\n');
      c.trim();
      return c;
   }
   return "";
}

String cmd;

void loop() {
  cmd = getCommand();
  val = digitalRead(0);
   if (val == LOW || cmd=="GetSQM") {


   
   }
}


Re: Kört fast i C++ (Arduino)

Postat: 24 november 2016, 19:20:59
av Skogen
Kanske så?

Kod: Markera allt

if ((Serial.readString() == "GetSQM") or (digitalRead(buttonSQM) == LOW)) {

Re: Kört fast i C++ (Arduino)

Postat: 24 november 2016, 19:26:11
av Corpze
Ah, perfa, kom just på att jag använde "string" imorse när kommandot via serial monitorn funka...
Råkade sedan spara över den filen som funkade :roll:

Nu funkar koden som den ska :)
Tusen tack :)

Nu ska jag försöka få den att köra koden en gång när jag trycker på den fysiska knappen och om jag skickar kommandot ska den köra i oändlighet 1ggn/30sek :P