Программирование сенсорного устройства XM1000 на языке программирования C Требуется оператор if

Я программирую сенсорный датчик (XM1000). Я использую операционную систему Contiki для программирования этих устройств (я использую терминал для просмотра выходных данных и GEdit для записи моего кода «C». Этот датчик имеет датчик температуры, освещенности и влажности. на борту, а также 3 светодиодных фонаря.

Ниже у меня есть два набора кода. Первый набор кодов работает и дает мне показания датчика для значений температуры, света и влажности.

Второй набор кодовых функций. он включает/выключает светодиодные индикаторы и заставляет их регулярно мигать на сенсорном узле XM1000, подсчитывает количество миганий светодиода и выводит счет на консоль.

Проблема, с которой я сталкиваюсь, заключается в создании оператора if для выполнения следующих условий, и я изо всех сил пытаюсь объединить два кода вместе. Итак, вот чего я хочу добиться:

• Если температура превышает 26 градусов, включите светодиод 1 на 5 секунд, в противном случае, если температура равна или ниже 26 градусов, выключите светодиод 1.

• Если влажность превышает 40 %, включите светодиод 2 на 5 секунд, иначе, если влажность равна или ниже 40 %, выключите светодиод 2.

• Если интенсивность света превышает 510 нанометров, включите светодиод 3 на 5 секунд, в противном случае, если интенсивность света равна или ниже 510 нм, выключите светодиод 3.

Первый набор кода: он измеряет температуру, свет и влажность и выводит результаты в окно терминала.

    #include "contiki.h" //Contiki Header File 
    #include "dev/light-sensor.h" //Light Sensor Header File 
    #include "dev/sht11-sensor.h" //Temperature and Humidity Header File 

    #include <stdio.h> /* for printf() */ // standard input/output library needed to write to the standard output

    static struct etimer timer; //Process Requires a Timer 
    int light=0, temp=0, humid=0;

    //To Start

    /*___________________________________________________*/

    PROCESS(sensor_reading_process, "Sensor Reading Process");
    AUTOSTART_PROCESSES(&sensor_reading_process);

    /*___________________________________________________*/

    //PROCESS BEGINS 

    PROCESS_THREAD(sensor_reading_process, ev, data)
   {
     PROCESS_BEGIN();

     SENSORS_ACTIVATE(light_sensor); //Activate the Light Sensor
     SENSORS_ACTIVATE(sht11_sensor);//Activate Temp/Humidity Sensor

     etimer_set(&timer, CLOCK_CONF_SECOND);//Configuring Timer 1SEC

     while(1) {  //Start of While Loop 

     PROCESS_WAIT_EVENT_UNTIL(ev==PROCESS_EVENT_TIMER);//Wait4Time


    // This is how we get the Sensor Values for light, temp, hum
    light = light_sensor.value(LIGHT_SENSOR_PHOTOSYNTHETIC);
    temp = sht11_sensor.value(SHT11_SENSOR_TEMP);
    humid = sht11_sensor.value(SHT11_SENSOR_HUMIDITY);

    printf("Light=%d, Temp=%d, Humid=%d\n", light, temp, humid); 
    //Above Line if Print Plus Values 
    etimer_reset(&timer); //Reset the Timer 

    }

    PROCESS_END(); //End of Process
     }

Второй код:

    #include "contiki.h" 
    #include "leds.h"  // LED HEADER FILE 
    #include <stdio.h> /* for printf() */ 
    static struct etimer timer; 
    /*____________________________________________________*/ 
    PROCESS(led_blinking_process, "LED Blinking Process"); 
    PROCESS(LED_process, "LED process"); 
    AUTOSTART_PROCESSES(&LED_process); 
    /*____________________________________________________*/ 


     PROCESS_THREAD(LED_process, ev, data) 
     { 
     static int count = 0; 
     PROCESS_BEGIN(); 
     etimer_set(&timer, CLOCK_CONF_SECOND/2); // 0.5S timer 
     leds_init(); // initialise the LEDs 
     while(1) { 
     PROCESS_WAIT_EVENT_UNTIL(ev==PROCESS_EVENT_TIMER); // wait for timer             event 
    count++; // count the blinking times 
    process_start(&led_blinking_process, NULL); // to blink the BLUE Led 
    printf("Count: %d\n", count); // output the counter number to console 
    etimer_reset(&timer); // reset the timer 
    } 
    PROCESS_END(); 
    } 


    CODE FOR LED LIGHTS 

    /*____________________________________________________*/ 
    PROCESS_THREAD(led_blinking_process, ev, data) 
    { 
    PROCESS_BEGIN(); 
    leds_toggle(LEDS_BLUE); // Blinking the Blue LED 
    PROCESS_END(); 
    }

Обратите внимание, что оба кода работают, когда я их запускаю, я просто пытаюсь их объединить, используйте оператор if, чтобы я мог выполнить свои функции, которые я указал выше.

Заранее спасибо за любую помощь или вклад!


person Jasjoot Muhdar    schedule 24.04.2016    source источник
comment
tutorialspoint.com/cprogramming/if_else_statement_in_c.htm   -  person OldProgrammer    schedule 25.04.2016
comment
Вы намерены, чтобы все работало на этих 5-секундных отметках? То есть каждые пять секунд вы считываете влажность, освещенность и т.д. и выставляете свет? Или вы хотели, чтобы условия проверялись чаще?   -  person aghast    schedule 25.04.2016
comment
Просто для целей тестирования я сделал это в течение 5 секунд, это может быть больше или меньше, я в основном пытаюсь запустить систему полива, где, если условия соблюдены, то включается светодиод, который представляет собой разбрызгиватель воды @AustinHastings   -  person Jasjoot Muhdar    schedule 25.04.2016
comment
Следующий вопрос: какие единицы возвращают различные датчики? Соответствуют ли они вашим желаемым условиям? То есть, если я опрошу датчик освещенности, он вернет целое число в нанометрах или что-то еще?   -  person aghast    schedule 25.04.2016
comment
Если интенсивность света превышает 510 нанометров - впервые слышу, что сила света измеряется в нанометрах. Что это хотя бы значит?   -  person kfx    schedule 25.04.2016
comment
Итак... вы написали весь этот код и боретесь с «если»? Хм...   -  person nicomp    schedule 25.04.2016
comment
Вы слишком все усложняете. Вам не нужны отдельные led_blinking_process и LED_process — объедините их в один. (Вы даже можете сделать все в самом sensor_reading_process.) Если вы решите сохранить 2 процесса, добавьте строку process_poll(&LED_process); в процесс датчиков, чтобы сигнализировать процессу светодиода о том, что датчики только что были прочитаны.   -  person kfx    schedule 25.04.2016
comment
Со временем я переведу их в градусы, используя 0,01 * sht11_sensor.value(SHT11_SENSOR_TEMP) - 39,6; , @AustinHastings Я преобразовал их, свет и влажность отображаются как обычные цифры, например, 634, 234   -  person Jasjoot Muhdar    schedule 25.04.2016
comment
@kfx датчик измеряет свет в нанометрах, проверьте спецификацию xm1000 advanticsys.com /shop/asxm1000-p-24.html   -  person Jasjoot Muhdar    schedule 25.04.2016
comment
Jasjoot, nm относится к пиковой спектральной чувствительности (свет — это электромагнитные волны с определенной длиной волны) ">en.wikipedia.org/wiki/ Датчики измеряют en.wikipedia.org /wiki/Irradiance с поправкой на кривые спектральной чувствительности датчиков, которые измеряются в ваттах на квадратную единицу.   -  person kfx    schedule 25.04.2016
comment
Извините за вызванную путаницу. Когда я запускаю свой первый скрипт, он показывает такие показания, как: Свет = 209, Температура = 6680, Влажность = 734, он обновляется каждую секунду, и цифры почти одинаковы.   -  person Jasjoot Muhdar    schedule 25.04.2016


Ответы (1)


Вот как, я думаю, это будет выглядеть, плюс-минус небольшой взлом. Я структурировал код как единый цикл, который просто опрашивает все три датчика с интервалом в 5 секунд. Таким образом, каждые 5 секунд состояние включения/выключения всех трех индикаторов может меняться. Я полагаю, что для полива газона вам не нужна точность долей секунды, чтобы знать, когда стало жарко, темно или что-то в этом роде.

Основываясь на ваших ответах в разделе комментариев OP, возможно, потребуется выполнить некоторые вычисления с использованием возвращаемых значений показаний датчика. Я полагаю, что, вероятно, проще выполнять вычисления во время компиляции, поэтому код смещен таким образом.

#include <stdio.h> /* for printf() */ 

#include "contiki.h" 
#include "leds.h"
#include "dev/light-sensor.h"
#include "dev/sht11-sensor.h"

PROCESS(Led_management_process, "LED Management Process"); 
AUTOSTART_PROCESSES(&Led_management_process); 

static struct etimer Timer; 

/* Per the online docs at http://www.advanticsys.com/wiki/index.php?title=TestCM5000

     T = -39.6 + 0.01 × SO(T)

So, solving for SOt gives:
*/
#define degreesC(n) (n)

#define TEMP_D1 degreesC(-39.6)
#define TEMP_D2 degreesC(0.01)
#define TEMP_THRESHOLD(tempC) (int)(((((double)(tempC))-(TEMP_D1))/(TEMP_D2)))

#define TARGET_TEMP_READING  TEMP_THRESHOLD(degreesC(26))

#define LIGHT_LED LEDS_GREEN
#define HUM_LED   LEDS_BLUE
#define TEMP_LED  LEDS_RED

PROCESS_THREAD(Led_management_process, ev, data) 
{ 
    static int humidity_led_on = 0;
    static int light_led_on = 0;
    static int temp_led_on = 0;

    PROCESS_BEGIN();
    SENSORS_ACTIVATE(light_sensor);
    SENSORS_ACTIVATE(sht11_sensor);
    leds_init();

    unsigned int cycle = 0;

    while (1) {
        printf("%8u:", cycle);

        /* This part is questionable, since I don't know if the 
           sensors are guaranteed to return ints (vs. floats or
           something) and I don't know what units they use. */
        int temp = sht11_sensor.value(SHT11_SENSOR_TEMP);

        if (temp > TARGET_TEMP_READING) {
            printf(" TEMP warm- ");
            if (!temp_led_on) {
                printf("toggle LED");
                temp_led_on = 1;
                leds_toggle(TEMP_LED);
            }
            else {
                printf("LED is ok ");
            }
        }
        else {
            printf(" TEMP cold- ");
            if (temp_led_on) {
                printf("toggle LED");
                temp_led_on = 0;
                leds_toggle(TEMP_LED);
            }
            else {
                printf("LED is ok ");
            }
        }

        /* Code for humidity */
        /* Code for light */

        printf("\n");

        /* Sleep 5 seconds */
        etimer_set(&Timer, CLOCK_CONF_SECOND * 5);
        PROCESS_WAIT_EVENT_UNTIL(ev==PROCESS_EVENT_TIMER);
        etimer_reset(&Timer);
        ++cycle;
    }

    PROCESS_END(); 
} 
person aghast    schedule 24.04.2016
comment
Спасибо, сейчас попробую! - person Jasjoot Muhdar; 25.04.2016
comment
Он вернулся с ошибками 1) ошибка «Таймер» не объявлена ​​(первое использование в этой функции) 2) примечание: каждый необъявленный идентификатор сообщается только один раз для каждой функции, в которой он появляется 3) предупреждение: неиспользуемая переменная «temp_led_on» 4) предупреждение: неиспользуемая переменная 'humidity_led_on - person Jasjoot Muhdar; 25.04.2016
comment
Я изменил это, чтобы показать расчет температуры. Я думаю, что, вероятно, лучше выполнять математику во время компиляции. Я не знаю, почему Таймер выдает вам ошибку - вы получили декларацию? Это близко к вершине. Неиспользуемые переменные, очевидно, должны быть заполнены вами. ;-) - person aghast; 25.04.2016
comment
Спасибо за вашу помощь @Austin Hastings, я просто чувствую, что это становится все сложнее для меня, и я чувствую себя потерянным, я новичок в языке программирования C. :((( - person Jasjoot Muhdar; 25.04.2016
comment
Ряд проблем в ответе, которые видны даже без проверки кода: timer будет неопределенным, поэтому код даже не скомпилируется; в PROCESS_WAIT_EVENT_UNTIL вы также должны проверить, возвращает ли etimer_expired(&Timer) значение true; cycle всегда будет равно 0. - person kfx; 25.04.2016
comment
Хорошо, исправил timer -›Timer. Что с проверкой etimer_expired? Это не часть примера кода (и я просто склеиваю фрагменты его кода — у меня нет ни одного из этих устройств, и я не могу найти какие-либо полезные документы). - person aghast; 25.04.2016