Кнопка не выдает корректный вывод

#c #raspberry-pi #mbed

#c #raspberry-pi #mbed

Вопрос:

Это код, который я использую для отображения средней температуры каждые 120 секунд на устройстве mbed и отображения предыдущего среднего значения при нажатии SW2. Когда я нажимаю кнопку SW2 более одного раза, она не отображает правильный вывод. Который должен быть предыдущим средним значением при однократном нажатии и средним значением с буквой «r» при нажатии до истечения 10 секунд. Если я снова нажму кнопку слишком быстро, это не обеспечит необходимый вывод, который указан выше.

Ценю некоторые указания о том, почему это происходит и как это исправить. Заранее спасибо.

Также эта программа кажется плохой по дизайну / логике, что она не выполняет то, что должна?

 #include "mbed.h"
//LM75B.h package used to obtain
//temperature readings
#include "LM75B.h"
//C12832.h package used to display
//readings on LCD
#include "C12832.h"
//temperature sensor
static LM75B temperature(D14,D15);
//display
static C12832 lcd(D11, D13, D12, D7, D10);
//Button SW2 as a interrupt
InterruptIn sw(SW2);
//Ticker object to run a function at intervals
Ticker ticker;
Ticker ticker2;
//Timer to keep track of time in seconds
Timer timer;
//volatile variable to help with ticker
volatile int actionThis=0;
//variable to check if button
//was already pressed
int pressed=0;
//assign initial temperature values
float avgTemp=temperature.temp();

float tempNow=temperature.temp();
//how often temperature should be taken
#define TEMP_FREQUENCY                  10//in seconds
//how many times temperature should be taken
// to get average
#define AVG_TEMP_AFTER_N_TEMPS          12


//function to initialise temperature taking to calculate
//average temperature
void somethinghappened(void)
{

    actionThis=2;

}

//second function to resolve issue
//of ticker not detaching and attaching correctly 
void somethinghappened2(void)
{

    actionThis=2;

}


//function to display temperature
//at button press
void theTemp(void)
{

//check if a temperature reading
//was taken
    if((timer.read()<TEMP_FREQUENCY)amp;amp; pressed) {
        pressed=0;
//position output on screen
        lcd.locate(0,3);
//display laterst average temperature again
        lcd.printf("%.2f%cn", avgTemp,'r');
        wait(3);
        lcd.cls();
//stop current ticker
        ticker.detach();
//start ticker2 with different frequency
//to resolve problem of ticker not correctly detaching 
//and re attching to same function
        ticker.attach(somethinghappened2,(TEMP_FREQUENCY 1));
    } else {
        pressed=1;
        lcd.locate(0,3);
        lcd.printf("%.2fn", avgTemp);
        wait(3);
//clear the screen
        lcd.cls();
//reset timer to 0
        timer.reset();
        ticker.detach();
        ticker.attach(somethinghappened2,(TEMP_FREQUENCY 1));
    }
}


//function to get temperature at a regular
//interval and display average after certain
//time has passed
void calcAvg(void)
{
    int x;
    tempNow=0;

//loop to display average temperature after
//certain time period
    for( x=1; x<(AVG_TEMP_AFTER_N_TEMPS 1); x  ) {

        tempNow=tempNow temperature.temp();

        if(x==AVG_TEMP_AFTER_N_TEMPS) {
            timer.stop();
            avgTemp=tempNow/x;

            lcd.locate(0,3);
            lcd.printf("%.2fn", avgTemp);
            wait(3);
            lcd.cls();

            break;
        }
//sleep until called by ticker
        sleep();
    }
}


int main (void)
{
//timer to track time passed
        timer.start();
//run function at button press
    sw.rise(amp;theTemp);
    ticker.attach(somethinghappened,TEMP_FREQUENCY);
//run infinitely
    while(1) {
        if(actionThis==2) {
            actionThis=0;
            calcAvg();
        }
//sleep till called 
        sleep();
    }
}
  

Комментарии:

1. Пожалуйста, выберите один язык, если только ваш вопрос конкретно не касается взаимодействия между несколькими программами, написанными на разных языках. Это похоже на C . Пожалуйста, объясните, почему Java и C упоминаются в тегах (это приведет к появлению вашего вопроса при поиске по этим языкам).

2. Привет, Пэдди, да, это C . Я подумал, что, поскольку все эти языки в основном похожи, я бы поставил как java, так и c.

3. Этот код не будет компилироваться как C или Java. Когда вы помечаете как C или Java, вы привлекаете экспертов по C или Java, которые захотят предложить свой опыт в этих языках для решения вашей проблемы. Вашим утверждением о том, что языки «в основном похожи», гораздо выше вероятность, что вы потратите впустую их время или потенциально привлечете некачественные ответы в случае, когда кто-то думает , что понимает язык, основываясь на том, что он знает о другом.