Kört fast i C++ (Arduino)

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

Kört fast i C++ (Arduino)

Inlägg 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
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

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

Inlägg 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) {

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

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

Inlägg 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
SeniorLemuren
Inlägg: 7812
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

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

Inlägg 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.
Corpze
Inlägg: 256
Blev medlem: 29 januari 2013, 17:31:27

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

Inlägg 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) {
Borre
Inlägg: 4572
Blev medlem: 14 juni 2007, 15:43:50
Ort: Hälsingland

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

Inlägg 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
Skogen
Inlägg: 904
Blev medlem: 5 januari 2013, 22:50:34
Ort: Alingsås

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

Inlägg av Skogen »

utan att ha provat, men nåt liknande

Kod: Markera allt

if ((Serial.read() == "GetSQM") or (digitalRead(buttonSQM) == LOW)) {
janno
Inlägg: 405
Blev medlem: 11 oktober 2009, 07:34:45
Ort: Västerås

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

Inlägg 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
Corpze
Inlägg: 256
Blev medlem: 29 januari 2013, 17:31:27

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

Inlägg 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();
            }
         }
      }
}   }
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

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

Inlägg 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") {


   
   }
}

Skogen
Inlägg: 904
Blev medlem: 5 januari 2013, 22:50:34
Ort: Alingsås

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

Inlägg av Skogen »

Kanske så?

Kod: Markera allt

if ((Serial.readString() == "GetSQM") or (digitalRead(buttonSQM) == LOW)) {
Corpze
Inlägg: 256
Blev medlem: 29 januari 2013, 17:31:27

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

Inlägg 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
Skriv svar