diff --git a/scheduler/include/scheduler.h b/scheduler/include/scheduler.h
index 0effa946db7e27abd75e62ddef208306c0f7b5f1..40b835104285c1c424fd69d12353fc00fb5b77f0 100644
--- a/scheduler/include/scheduler.h
+++ b/scheduler/include/scheduler.h
@@ -32,6 +32,7 @@ typedef struct{
   unsigned char period_ms;
   unsigned int pulse;
   unsigned char enabled;
+  unsigned char one_shot;
   void *data;
 }TSchedulerChannel;
 
@@ -48,8 +49,10 @@ void scheduler_init(TScheduler *scheduler,unsigned char num_channels, unsigned s
 void scheduler_interrupt(TScheduler *scheduler,sched_channel_t channel_id);
 unsigned short int scheduler_get_pulse(TScheduler *scheduler, sched_channel_t channel_id);
 void scheduler_set_channel(TScheduler *scheduler,sched_channel_t channel_id, void (*function)(void *data), unsigned char period_ms,void *data);
+void scheduler_set_channel_one_shot(TScheduler *scheduler,sched_channel_t channel_id, void (*function)(void *data), unsigned char delay_ms,void *data);
 void scheduler_enable_channel(TScheduler *scheduler,sched_channel_t channel_id);
 void scheduler_change_period(TScheduler *scheduler,sched_channel_t channel_id,unsigned char period_ms);
+void scheduler_change_delay(TScheduler *scheduler,sched_channel_t channel_id,unsigned char delay_ms);
 void scheduler_disable_channel(TScheduler *scheduler,sched_channel_t channel_id);
 
 #ifdef __cplusplus
diff --git a/scheduler/src/scheduler.c b/scheduler/src/scheduler.c
index d396e9be9c7a8e1f9030392f15b5d6ab84873e35..a7501520384d9cd7af5c2fb34c72ddd4f947052c 100644
--- a/scheduler/src/scheduler.c
+++ b/scheduler/src/scheduler.c
@@ -29,6 +29,7 @@ void scheduler_init(TScheduler *scheduler,unsigned char num_channels, unsigned s
     scheduler->channels[i].function=0x00000000;
     scheduler->channels[i].period_ms=0;
     scheduler->channels[i].enabled=0x00;
+    scheduler->channels[i].one_shot=0x00;
   }
   scheduler->num_channels=num_channels;
   scheduler->prescaler=prescaler;
@@ -41,10 +42,19 @@ void scheduler_interrupt(TScheduler *scheduler,sched_channel_t channel_id)
 {
   if(channel_id<scheduler->num_channels)
   {
-    if(scheduler->set_pulse!=0x00000000)
-      scheduler->set_pulse(scheduler_get_channel(channel_id),scheduler->channels[channel_id].pulse,0x01);
-    if(scheduler->channels[channel_id].function!=0x00000000)
-      scheduler->channels[channel_id].function(scheduler->channels[channel_id].data);
+    if(scheduler->channels[channel_id].one_shot==0x00)
+    {
+      if(scheduler->set_pulse!=0x00000000)
+        scheduler->set_pulse(scheduler_get_channel(channel_id),scheduler->channels[channel_id].pulse,0x01);
+      if(scheduler->channels[channel_id].function!=0x00000000)
+        scheduler->channels[channel_id].function(scheduler->channels[channel_id].data);
+    }
+    else
+    {
+      if(scheduler->channels[channel_id].function!=0x00000000)
+        scheduler->channels[channel_id].function(scheduler->channels[channel_id].data);
+      scheduler_disable_channel(scheduler,channel_id);
+    }
   }
 }
 
@@ -62,6 +72,25 @@ void scheduler_set_channel(TScheduler *scheduler,sched_channel_t channel_id, voi
     scheduler->channels[channel_id].period_ms=period_ms;
     scheduler->channels[channel_id].pulse=scheduler_ms_to_pulse(scheduler,period_ms);
     scheduler->channels[channel_id].data=data;
+    scheduler->channels[channel_id].one_shot=0x00;
+  }
+}
+
+void scheduler_set_channel_one_shot(TScheduler *scheduler,sched_channel_t channel_id, void (*function)(void *data), unsigned char delay_ms,void *data)
+{
+  if(channel_id<scheduler->num_channels)
+  {
+    if(scheduler->channels[channel_id].enabled==0x01)
+    {
+      if(scheduler->stop!=0x00000000)
+        scheduler->stop(channel_id);
+      scheduler->channels[channel_id].enabled=0x00;
+    }
+    scheduler->channels[channel_id].function=function;
+    scheduler->channels[channel_id].period_ms=delay_ms;
+    scheduler->channels[channel_id].pulse=scheduler_ms_to_pulse(scheduler,delay_ms);
+    scheduler->channels[channel_id].data=data;
+    scheduler->channels[channel_id].one_shot=0x01;
   }
 }
 
@@ -84,8 +113,23 @@ void scheduler_change_period(TScheduler *scheduler,sched_channel_t channel_id,un
 {
   if(channel_id<scheduler->num_channels)
   {
-    scheduler->channels[channel_id].period_ms=period_ms;
-    scheduler->channels[channel_id].pulse=scheduler_ms_to_pulse(scheduler,period_ms);
+    if(scheduler->channels[channel_id].one_shot==0x00)
+    {
+      scheduler->channels[channel_id].period_ms=period_ms;
+      scheduler->channels[channel_id].pulse=scheduler_ms_to_pulse(scheduler,period_ms);
+    }
+  }
+}
+
+void scheduler_change_delay(TScheduler *scheduler,sched_channel_t channel_id,unsigned char delay_ms)
+{
+  if(channel_id<scheduler->num_channels)
+  {
+    if(scheduler->channels[channel_id].one_shot==0x01)
+    {
+      scheduler->channels[channel_id].period_ms=delay_ms;
+      scheduler->channels[channel_id].pulse=scheduler_ms_to_pulse(scheduler,delay_ms);
+    }
   }
 }