Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: ds3231 mbed-rtos mbed DHT
Diff: main.cpp
- Revision:
- 9:5e9c4277151d
- Parent:
- 7:8065e844e99a
- Child:
- 10:f14f47225091
--- a/main.cpp Sat Apr 29 15:16:10 2017 +0000
+++ b/main.cpp Mon May 08 07:20:54 2017 +0000
@@ -1,223 +1,149 @@
#include "mbed.h"
#include "rtos.h"
-#include "ds3231.h"
-#include "DHT.h"
-
-#define ESC 0x1B
-#define I2C_SDA D14
-#define I2C_SCL D15
-#define DHT_EN_PIN D7
-#define DHT_PIN D6
-#define M_DIR_PIN D4
-#define M_SPE_PIN D5
+#include "main.h"
+#include "real_time_clock.h"
+#include "temp_hum_sensor.h"
-void setupRTC();
-void get_user_input(char* message, uint8_t min, uint8_t max, uint32_t* member);
-void get_user_input(char* message, uint8_t min, uint8_t max, bool* member);
-int readDHT(float* temperature, float* humidity, float* dewPoint);
-int measure(time_t* ts, float* temperature, float* humidity, float* dewPoint);
-int setMotor(int direction, double speed);
-void wakeupFromRTC(void);
+#define TASKS_NUMBER (sizeof(taskList)/sizeof(taskList[0]))
-Ds3231 rtc(D14, D15);
-
-PwmOut m_speed(D4);
-DigitalOut m_direction(D5);
-
-DHT DHTSensor(D6, DHT11);
-DigitalOut DHTEnable(D7);
-
-InterruptIn iRTC(D8);
+Mutex mutexData;
+SensorData data;
+Mutex mutexPCComm;
+Serial pc(USBTX,USBRX);
+volatile bool sensors_running = false;
-int main(void)
-{
- int measureError = 0;
- float temperature = 0.0, humidity = 0.0, dewPoint = 0.0;
- int motorDirection = 0;
- double motorSpeed = 0.0;
- char buffer[32];
- time_t ts;
+static struct task_definition_struct taskList[] = {
+ { temp_hum_thread, &temp_hum_init, NULL, NULL, osPriorityNormal, 100, NULL, 0 },
+ //{ nodeComm_thread, &initNodeComm, NULL, NULL, osPriorityNormal, 100, NULL, 0 }
+};
- //setupRTC();
- iRTC.rise(wakeupFromRTC);
-
+int main()
+{
+ pc.baud(9600);
+ mutexPCComm.lock();
+ pc.printf("MAIN: init\n");
+ mutexPCComm.unlock();
+ // Init RTC
+ time_t epoch_time;
+ epoch_time = rtc.get_epoch();
+ // Reset all data status
+ mutexData.lock();
+ data.DHTError = -128;
+ mutexData.unlock();
+ // Init all tasks
+ initTasks();
while(true) {
- //printf("%c[2J", ESC); //clear screen
- sleep();
- ts = rtc.get_epoch();
- measureError = measure(&ts,&temperature,&humidity,&dewPoint);
+ // Start all threads
+ sensors_running = true;
+ for (int i = 0; i < TASKS_NUMBER; i++) {
+ if (taskList[i].retVal == 1) {
+ taskList[i].thread->signal_set(0x1);
+ Thread::wait(taskList[i].delay);
+ taskList[i].thread->signal_clr(0x1);
+ }
+ }
+ publishSensorData();
+ // Stop all remain tasks
+ sensors_running = false;
+ Thread::wait(10000);
+ }
+}
- if(!measureError) {
- printf("\nTime as seconds since January 1, 1970 = %d\n", ts);
- printf("Temperature in Celcius: %4.2f\n", temperature);
- printf("Humidity is %4.2f, Dewpoint: %4.2f\n", humidity, dewPoint);
- setMotor(motorDirection, motorSpeed);
- }
- wait(1);
- }//loop
-}
-int measure(time_t* ts, float* temperature, float* humidity, float* dewPoint)
+int publishSensorData(void)
{
- int DHTError = 0;
- *ts = rtc.get_epoch();
- if(*ts<=0)
- return 1;
- DHTError = readDHT( temperature, humidity, dewPoint);
- if(DHTError) {
- printf("DHTError: %d\n", DHTError);
- return 2;
+ Timer t;
+ int error = -1;
+ t.reset();
+ t.start();
+ while(error != 0 && t.read()<MAX_TIME_TO_WAIT_NODE_COMM) {
+ mutexData.lock();
+ // Check if all data are valid
+ error = data.DHTError;
+ if( error == 0) {
+ // Send all info
+ mutexPCComm.lock();
+ pc.printf("Temp\t%f\n",data.temperature);
+ pc.printf("Hum\t%f\n",data.humidity);
+ pc.printf("DewP\t%f\n",data.dewPoint);
+ mutexPCComm.unlock();
+ }
+ mutexData.unlock();
+ if(error!=0) {
+ Thread::wait(3000);
+ }
+ mutexPCComm.lock();
+ pc.printf("MAIN: req data\t%f\n",t.read());
+ mutexPCComm.unlock();
+ } // while
+ t.stop();
+ // Send valid info only
+ if(error!=0) {
+ mutexData.lock();
+ if( data.DHTError == 0) {
+ mutexPCComm.lock();
+ pc.printf("Temp:\t%f\n",data.temperature);
+ pc.printf("Hum:\t%f\n",data.humidity);
+ pc.printf("DewP:\t%f\n",data.dewPoint);
+ pc.printf("DHTError:\t%d\n",data.DHTError);
+ mutexPCComm.unlock();
+ } else {
+ mutexPCComm.lock();
+ pc.printf("DHTError:\t%d\n",data.DHTError);
+ mutexPCComm.unlock();
+ }
+ mutexData.unlock();
}
- return 0;
-
-}
-int readDHT(float* temperature, float* humidity, float* dewPoint)
-{
- int error = 0;
- DHTEnable = 1;
- wait(2);
- error = DHTSensor.readData();
- if (0 == error) {
- *temperature = DHTSensor.ReadTemperature(CELCIUS);
- *humidity = DHTSensor.ReadHumidity();
- *dewPoint = DHTSensor.CalcdewPoint(*temperature, *humidity);
- }
- DHTEnable=0;
+ // Reset all data status
+ mutexData.lock();
+ data.DHTError = -128;
+ mutexData.unlock();
return error;
}
-int setMotor(int direction, double speed)
-{
- if(speed<0 or speed>255)
- return 1;
- else {
- m_speed = speed;
- if(direction)
- m_direction=1;
- else
- m_direction=0;
- }
- return 0;
-}
-
-void setupRTC()
-{
-
- //default, use bit masks in ds3231.h for desired operation
- ds3231_cntl_stat_t rtc_control_status = {0,0};
- ds3231_time_t rtc_time;
- ds3231_calendar_t rtc_calendar;
-
- rtc.set_cntl_stat_reg(rtc_control_status);
-
- //get day from user
- get_user_input("\nPlease enter day of week, 1 for Sunday (1-7): ", 1,
- 7, &rtc_calendar.day);
-
- //get day of month from user
- get_user_input("\nPlease enter day of month (1-31): ", 1, 31,
- &rtc_calendar.date);
-
- //get month from user
- get_user_input("\nPlease enter the month, 1 for January (1-12): ", 1,
- 12, &rtc_calendar.month);
-
- //get year from user
- get_user_input("\nPlease enter the year (0-99): ",0, 99,
- &rtc_calendar.year);
-
- //Get time mode
- get_user_input("\nWhat time mode? 1 for 12hr 0 for 24hr: ", 0, 1,
- &rtc_time.mode);
-
- if(rtc_time.mode) {
- //Get AM/PM status
- get_user_input("\nIs it AM or PM? 0 for AM 1 for PM: ", 0, 1,
- &rtc_time.am_pm);
- //Get hour from user
- get_user_input("\nPlease enter the hour (1-12): ", 1, 12,
- &rtc_time.hours);
- } else {
- //Get hour from user
- get_user_input("\nPlease enter the hour (0-23): ", 0, 23,
- &rtc_time.hours);
- }
-
- //Get minutes from user
- get_user_input("\nPlease enter the minute (0-59): ", 0, 59,
- &rtc_time.minutes);
-
-
- //Get seconds from user
- get_user_input("\nPlease enter the second (0-59): ", 0, 59,
- &rtc_time.seconds);
+static uint32_t initTasks(void)
+{
+ uint32_t i;
+ uint32_t retval = 1;
- //Set the time, uses inverted logic for return value
- if(rtc.set_time(rtc_time)) {
- printf("\nrtc.set_time failed!!\n");
- exit(0);
- }
-
- //Set the calendar, uses inverted logic for return value
- if(rtc.set_calendar(rtc_calendar)) {
- printf("\nrtc.set_calendar failed!!\n");
- exit(0);
+ mutexPCComm.lock();
+ pc.printf("initTasks: init\n");
+ mutexPCComm.unlock();
+ for (i = 0; i < TASKS_NUMBER; i++) {
+ mutexPCComm.lock();
+ pc.printf("initTasks: %d\n",i);
+ mutexPCComm.unlock();
+ if (taskList[i].init != NULL) {
+ if ((taskList[i].retVal = ((*taskList[i].init)(taskList[i].init_args))) == 0)
+ retval = 0;
+ } else {
+ taskList[i].retVal = 1;
+ }
}
-
-}
-
-/**********************************************************************
-* Function: get_user_input()
-* Parameters: message - user prompt
-* min - minimum value of input
-* max - maximum value of input
-* member - pointer to struct member
-* Returns: none
-*
-* Description: get time/date input from user
-*
-**********************************************************************/
-void get_user_input(char* message, uint8_t min, uint8_t max, uint32_t* member)
-{
- uint32_t temp;
-
- do {
- printf("\n%s", message);
-
- //for some reason mbed doesn't like a pointer to a member in scanf
- //term.scanf("%d", member); works with gcc on RPi
- scanf("%d", &temp);
-
- *member = temp;
+ for (i = 0; i < TASKS_NUMBER; i++) {
+ mutexPCComm.lock();
+ pc.printf("initTasks: start %d\n",i);
+ mutexPCComm.unlock();
+ Thread::wait(taskList[i].delay);
- if((*(member)< min) || (*(member) > max)) {
- printf("\nERROR-RTI");
+ mutexPCComm.lock();
+ pc.printf("initTasks: su1 %d\n",retval);
+ mutexPCComm.unlock();
+ if (taskList[i].retVal == 1) {
+ taskList[i].thread = new Thread(taskList[i].task, taskList[i].task_args, taskList[i].priority);
}
- } while((*(member) < min) || (*(member) > max));
-}
-
-
-void get_user_input(char* message, uint8_t min, uint8_t max, bool* member)
-{
- uint32_t temp;
-
- do {
- printf("\n%s", message);
- //for some reason mbed doesn't like a pointer to a member in scanf
- //term.scanf("%d", member); works with gcc on RPi
- scanf("%d", &temp);
-
- *member = temp;
+ mutexPCComm.lock();
+ pc.printf("initTasks: finish su2 %d\n",retval);
+ mutexPCComm.unlock();
+ }
- if((*(member)< min) || (*(member) > max)) {
- printf("\nERROR-RTI");
- }
- } while((*(member) < min) || (*(member) > max));
-}
-void wakeupFromRTC(void){}
-
+ mutexPCComm.lock();
+ pc.printf("initTasks: finish %d\n",retval);
+ mutexPCComm.unlock();
+ return retval;
+}
\ No newline at end of file
