Relay counter

Dependencies:   TM1638 mbed mbed-rtos AT45

Revision:
0:1b4c0e7c9316
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main_count_v1.cmm	Thu Jan 28 14:18:16 2021 +0000
@@ -0,0 +1,267 @@
+
+/**************rele-counter v1  **********************************/
+//  при включении восстанавливаются значения текущие и уставка  
+//  при подаче импульсов +24В на счетный вход значение  увеличиваются +1
+//  при подаче +24В на вхд сброса, значения сбрасываются  
+//  реле включается если  значение равно или больше  установленного
+//
+
+
+
+#include "mbed.h"
+#include "rtos.h"
+#include "TM1638.h"
+#include "AT45.h"
+
+
+// -------  input/output  ----------------
+DigitalOut  led(PC_13);
+DigitalOut  rel(PA_15);
+DigitalIn   in1(PA_8);
+DigitalIn   in2(PA_9);
+DigitalIn   in3(PA_10);
+
+//  -------  displey --------------------
+TM1638_LEDKEY8 LEDKEY8(PB_15,PB_14,PB_13, PB_12);
+TM1638::KeyData_t keydata; 
+
+
+//----------- SPI FLASH  ------------------------
+SPI 	spi(PA_7, PA_6, PA_5); 	// mosi, miso, sclk
+AT45 	spif(&spi, PA_4);		// NSS
+
+char *spi_buffer = (char*) malloc(64);
+char str[10]; 
+
+
+// --------  глоб.переменные ---------------
+int present_val = 0;				// текущее заначение 
+int present_val_last = 0;			// текущее значение (старое)
+int max_value = 0;					// значение  вкл. реле
+
+int  led1=0;						//  индикация LED1
+int  led2=0;						//  индикация LED2
+int  led3=0;						//  индикация LED3
+
+// --------  Прототипы функций:  ----------
+void count_value();
+
+
+/********************************************************************/
+int main() {
+	
+    //  предустановка  значений 
+    int update = 0;
+    int update2 = 0;
+    int delay_update_x10 = 2000;			//  задержка  перед  +/-  x_inreasing_decreasing
+    int time_update_increase = 0;			//  отсчет времени до  +10
+    int time_update_decrease = 0;			//  отсчет времени до -10
+    int delay_cycle = 25;					//  период вывода инф. на дисплей
+    int once_increase = 0;
+    int once_decrease = 0;
+    int x_inreasing_decreasing = 10;		//	+/-  после удержания кнопки
+   
+    
+    int write_page_time = 5000;				//  время до  записи  max_value
+    int timer_to_write_page = 0;			//  отсчет времени до  записи  max_value
+    int write_page_start = 0;				//  старт процедуры записи 
+    
+    
+    // Вычитываем сохраненное максимальное значение (11 стр для записи)
+    spif.read_page(spi_buffer, 11);
+    max_value = atoi(spi_buffer);
+    
+    // Вычитываем сохраненное текущее значение (12 стр для записи)
+    spif.read_page(spi_buffer, 12);
+    present_val = atoi(spi_buffer);
+    
+    // Делаем текущее значение != текущему прошлому значение
+    present_val_last = present_val + 10;
+    
+    // Поток для работы с текущим значением
+    Thread count_thread;
+    count_thread.start(count_value);
+    
+	
+	while(1) {
+		
+		/***  обработка нажатия кнопок   ***/
+		
+		LEDKEY8.getKeys(&keydata);
+		
+		// Нажимаем кнопку X, текущее значение = 0
+		if(keydata[LEDKEY8_SW3_IDX] == LEDKEY8_SW3_BIT) {
+			present_val = 0;
+		}
+		
+		
+		// Нажимаем кнопку увеличить 
+		if(keydata[LEDKEY8_SW1_IDX] == LEDKEY8_SW1_BIT) {
+			if(keydata[LEDKEY8_SW2_IDX] != LEDKEY8_SW2_BIT) {
+				time_update_increase = time_update_increase + delay_cycle;
+				
+				// Один раз делаем +1
+				if(once_increase == 0) {
+					once_increase = 1;
+					if(max_value<999){max_value = max_value + 1;}
+					update = 0;
+				}
+				
+				write_page_start = 1;
+				timer_to_write_page = 0;
+			}
+		}
+		else {
+			time_update_increase = 0;
+			once_increase = 0;
+		}
+		
+		
+		
+		// Нажимаем кнопку уменьшить
+		if(keydata[LEDKEY8_SW2_IDX] == LEDKEY8_SW2_BIT) {
+			if(keydata[LEDKEY8_SW1_IDX] != LEDKEY8_SW1_BIT) {
+				time_update_decrease = time_update_decrease + delay_cycle;
+				
+				// Один раз делаем -1
+				if(once_decrease == 0) {
+					once_decrease = 1;
+					if(max_value>0){max_value = max_value - 1;}
+					update = 0;
+				}
+				
+				write_page_start = 1;
+				timer_to_write_page = 0;
+			}
+		}
+		else {
+			once_decrease = 0;
+			time_update_decrease = 0;
+		}
+		
+		
+		
+		
+		// При удержании кнопки увеличить  на +10
+		if(keydata[LEDKEY8_SW1_IDX] == LEDKEY8_SW1_BIT) {
+			if(time_update_increase >= delay_update_x10) {
+				time_update_increase = delay_update_x10 - delay_cycle*10;
+				if(max_value<=990){max_value = max_value + x_inreasing_decreasing;}
+				update = 0;
+			}
+		}
+		
+		
+		
+		
+		// При удержании  кнопки уменьшить на -10
+		if(keydata[LEDKEY8_SW2_IDX] == LEDKEY8_SW2_BIT) {
+			if(time_update_decrease >= delay_update_x10) {
+				time_update_decrease = delay_update_x10 - delay_cycle*10;
+				if(max_value>10){max_value = max_value - x_inreasing_decreasing;}
+				update = 0;
+			}
+		}
+		
+		
+		
+		// Записываем в память максимальное значение 
+		// через время write_page_time после нажатий кнопок
+		if(write_page_start == 1) {
+			timer_to_write_page = timer_to_write_page + delay_cycle;
+			
+			if(timer_to_write_page >= write_page_time) {
+				write_page_start = 0;
+				timer_to_write_page = 0;
+				sprintf(spi_buffer, "%d", max_value);
+				spif.page_erase(11);  
+				spif.write_page(spi_buffer, 11);
+				
+				LEDKEY8.locate(0);
+				LEDKEY8.printf("   ");
+				Thread::wait(500);
+				LEDKEY8.locate(0);
+				LEDKEY8.printf("%d", max_value);
+			}
+		}
+		
+		
+		
+		/***  вывод на дисплей  ***/
+		
+		led = !led ;
+		
+		LEDKEY8.cls();
+		LEDKEY8.setBrightness(TM1638_BRT1);
+		LEDKEY8.locate(0);
+		LEDKEY8.printf("%d", max_value);
+		LEDKEY8.locate(3);
+		LEDKEY8.printf("%d", present_val);
+		if(led1==1){LEDKEY8.setIcon(TM1638_LEDKEY8::LD1);}else{LEDKEY8.clrIcon(TM1638_LEDKEY8::LD1);}
+		if(led2==1){LEDKEY8.setIcon(TM1638_LEDKEY8::LD2);}else{LEDKEY8.clrIcon(TM1638_LEDKEY8::LD2);}
+		if(led3==1){LEDKEY8.setIcon(TM1638_LEDKEY8::LD3);}else{LEDKEY8.clrIcon(TM1638_LEDKEY8::LD3);}
+				
+		
+		Thread::wait(delay_cycle);
+	}
+}
+
+/****************************************************************/
+
+// Поток работы с текущим значением 10msec
+void count_value() {
+	
+	int  c_inp1=0;
+	int  c_inp2=0;
+	int  c_inp3=0;
+	int  m_inp1=0;
+	int  m_inp2=0;
+	int  m_inp3=0;
+	
+	while(1) {
+		
+		//  фиксируем значения
+		if(in1==0){c_inp1=1;}else{c_inp1=0;}
+		if(in2==0){c_inp2=1;}else{c_inp2=0;}
+		if(in3==0){c_inp3=1;}else{c_inp3=0;}
+		
+		
+		// сохраняем тек.значение  в 12 стр. при выкл. питания
+		if(c_inp1==0 && m_inp1==1){
+			sprintf(spi_buffer, "%d", present_val);
+			spif.page_erase(12);  
+			spif.write_page(spi_buffer, 12);
+		}
+		
+		// подсчет импульсов по входу 1
+		if(c_inp2==1 && m_inp2==0){
+			present_val++;
+		}
+		
+		// сбрасываем текущее значение по входу 2
+		if(c_inp3==1 && m_inp3==0){
+			present_val=0;
+		}
+		
+		
+		// управление реле
+		if(present_val>=max_value){	rel=1; }else{rel=0;	}
+		
+		
+		// управляем светодиодами
+		if(rel==1)   {led1=1;}else{led1=0;}
+		if(c_inp2==1){led2=1;}else{led2=0;}
+		if(c_inp3==1){led3=1;}else{led3=0;}
+		
+
+		// сохраняем значени 
+		m_inp1=c_inp1;
+		m_inp2=c_inp2;
+		m_inp3=c_inp3;
+		
+		
+		Thread::wait(5);
+	}
+}
+
+