MATHANGSPK BLOG

Chia sẽ các thủ thuật về máy tính, tin học, các kiến thức điện tử cơ bản

Thứ Sáu, 12 tháng 7, 2019

Ở phần trước mình đã giới thiệu đến với các bạn các thao tác điều khiển nút nhấn trong arduino ở mức độ đơn giản, ở bài này mình sẽ giới thiệu tiếp cho các bạn các cách điều khiển nút nhấn ở mức độ sâu hơn.
Nếu các bạn thấy khó hiểu ở bài này có thể quay lại bài này để tìm hiểu lại từ đầu. Tại đây

Đề bài đặt ra như sau: Nhấn nút nhấn lần thứ nhất LED sáng, khi nhã ra LED vẫn sáng, nhấn lần thứ 2 LED tắt, nhã ra LED vẫn tắt, cứ tuần tự như vậy.

// Define the pins being used
int pin_LED = 10;
int pin_switch = 2;
 
// variables to hold the new and old switch states
boolean oldSwitchState = LOW;
boolean newSwitchState = LOW;
 
boolean LEDstatus = LOW;
 
void setup() 
{
    pinMode(pin_LED, OUTPUT);  
    digitalWrite(pin_LED,LOW); 
 
    pinMode(pin_switch, INPUT); 
}
 
void loop()
{
    newSwitchState = digitalRead(pin_switch);
 
    if ( newSwitchState != oldSwitchState ){
       // has the button switch been closed?
       if ( newSwitchState == HIGH ){
           if ( LEDstatus == LOW ){ 
             digitalWrite(pin_LED, HIGH);  
             LEDstatus = HIGH; }
           else{ 
             digitalWrite(pin_LED, LOW); 
             LEDstatus = LOW;  }
       }
       oldSwitchState = newSwitchState;
    }   
}

Giải thích code:
Chúng ta sẽ có các bit oldSwitchState, newSwitchState, LEDstatus để có thể kiểm soát được chương trình.
- Đầu tiên sẽ trạng thái nút nhấn hiện tại sẽ được lưu vào bit newSwitchState
- Tiếp đến sẽ kiểm tra xem trạng thái hiện tại có khác với trạng thái trước đó không? Nếu khác thì sẽ thực hiện các lệnh bên trong.
   + Ví dụ, nếu có nhấn, pin_switch sẽ lên 1, newSwitchState = 1, sẽ khác với giá trị 0 của oldSwitchState, đoạn code bên trong sẽ được thực thi, nếu giá trị mới của nút nhấn = 1 và trạng thái của LED đang OFF thì sẽ ra lệnh cho LED ON và lưu giá trị LEDstatus = 1, ngược lại nếu trạng thái LED đang ON thì sẽ ra lệnh cho LED OFF và lưu giá trị LEDstatus = 1. Lưu ý nếu giá trị mới của nút nhấn bằng 0 sẽ không thực hiện gì cả.

Các bạn hãy xem video dưới đây để dễ hiểu hơn nhé.


Ở bài viết này mình xin giới thiệu các bạn đến chức năng rất hay thường dùng trong arduino, đó là giao tiếp với nút nhấn, để điều khiển LED. Nếu điều khiển được LED, đồng nghĩa với việc bạn có thể điều khiển được bất cứ cơ cấu chấp hành nào. Vì đơn giản chúng có 1 nguyên lý hoàn toàn giống nhau.
Sơ đồ tổng quan.
Sơ đồ đấu nối phần cứng:

Chân D2 là chân sẽ nhận tín hiệu: Theo như mạch trên Bình thường khi chưa tác động nút nhấn chân D2 sẽ được nối xuống Mass lúc này D2 nhận tín hiệu 0V và sẽ là mức 0 trong logic, khi switch được nhấn sẽ có một điện áp 5V đi qua điện trở 10KOhm xuống mass, lúc này hiệu điện thế giữa chân D2 và Mass là 5V. Chân D2 nhận mức logic là 1.
Một câu đặt ra, liệu chúng ta có thể nối trực tiếp nguồn 5V qua switch và đưa thẳng vào chân D2 có được không? Đó là một ý kiến theo tôi là không hay nhưng nó hoàn toàn được, vì trước khi vào Vi Xử lý thì nó đã có 1 điện trở 10megaOhm.
Nhưng nếu đấu mạch như sơ đồ trên thì sẽ tránh được trường hợp tín hiệu vào chân D2 bị nhiễu, là một điểm đôi khi khá nhức đầu, nếu ta gặp sự cố khi mạch hoạt động như chúng ta mong muốn. Và tốt nhất thì các bạn nên đấu mạch như sơ đồ trên là một điều được khuyên dùng.

Phần trên là phần mình giới thiệu nguyên lý mạch và cách thức làm việc, tiếp đến sẽ đến phần viết code cho Arduino.

Về phần code thì đây là các hàm đơn giản nên các thư viện cơ bản khi các bạn cài Arduino IDE đã có đầy đủ, chỉ cần code thôi là chạy được rồi.


//  D10 to resister and LED
//  D2 to push button switch
//
 
// Define the pins being used
int pin_LED = 10;
int pin_switch = 2;
 
void setup() 
{
    pinMode(pin_LED, OUTPUT);  
    digitalWrite(pin_LED,LOW); 
 
    pinMode(pin_switch, INPUT); 
}
 
void loop()
{
    if ( digitalRead(pin_switch) == HIGH) 
    {
       digitalWrite(pin_LED, HIGH);
    }
    else
    {
       digitalWrite(pin_LED, LOW);
    }   
}

Giải thích code chút xíu cho các bạn nào mới có thể dễ hiểu hơn nhé.
Đầu tiên là khai báo:

int pin_LED = 10;
int pin_switch = 2;

Đây là phần thiết lập, khởi tạo khi Arduino khởi động (chỉ chạy duy nhất 1 lần khi on nguồn).
void setup() 
{
    pinMode(pin_LED, OUTPUT);  
    digitalWrite(pin_LED,LOW);  
    pinMode(pin_switch, INPUT); 
}
pinMode (pin_LED, OUTPUT) --> cấu hình cho chân pin_LED là ngỏ ra

digitalWrite(pin_LED,LOW) --> Set mức 0 cho chân pin_LED --> Đồng nghĩa khi khởi động xong thì chúng ta sẽ thấy LED tắt.

pinMode(pin_switch, INPUT) --> Cấu hình cho chân pin_switch là ngỏ vào.

Ok bây giờ các bạn hãy thử nạp code vào để chạy thử xem như thế nào?


Kết quả, Khi mình nhấn nút nhấn thì LED sẽ sáng và khi mình nhã nút nhấn ra LED sẽ tắt đúng không các bạn?

Đến bước này các bạn đã thấy hứng thú với việc chơi với em này chưa?
Hãy theo đường dẫn này để đến được với mô phỏng các bạn nhé. Tại đây

Đến với ví dụ thứ 2: Phần cứng chúng ta sẽ không thay đổi nhưng phần mềm sẽ có chút thay đổi, chúng ta sẽ sửa lại code một chút như sau:

int pin_LED = 10;
int pin_switch = 2;
boolean newButtonState = 0;
boolean oldButtonState = 0;
void setup()
{
  pinMode(pin_LED, OUTPUT);
  pinMode(pin_switch, INPUT);
}

void loop()
{
  newButtonState = digitalRead(pin_switch);
  if(newButtonState != oldButtonState){
    if(digitalRead(pin_switch)==HIGH){
      digitalWrite(pin_LED, HIGH);
    }else  digitalWrite(pin_LED, LOW);
    oldButtonState = newButtonState;
  }  
}

Ở đây chúng ta sẽ khai báo thêm 1 cặp biến mới được gán là trạng thái mới và cũ của nút nhấn của chúng ta:
boolean oldButtonState = 0;
boolean newButtonState = 0;
Ở trong vòng lặp loop(), chúng ta có code như sau:
- Đầu tiên, chúng ta sẽ cập nhật trạng thái biến newButtonState = tín hiệu hiện tại mà chân pin_switch nhận về.
- Tiếp theo, là bước so sánh giữa trạng thái mới và trạng thái cũ trước đó, nếu khác nhau được dùng != trong ngôn ngữ so sánh khác, thì trạng thái của LED sẽ được thay đổi.
- Nếu trạng thái mới không thay đổi thì đoạn chương trình sẽ không làm gì cả.

Chúng ta sẽ chạy chương trình bằng tay như sau:
- Khi nút nhấn chưa được nhấn, nghĩa là chân pin_switch sẽ là mức 0.
- newButtonState sẽ bằng 0.
- Vì giá trị gán ban đầu của oldButtonState = 0 nên newButtonState = oldButtonState nên sẽ thực hiện gì tiếp cả vì không đủ điều kiện để thực hiện.
- Khi nút nhấn được nhấn, nghĩa là chân pin_switch sẽ là mức 1.
- newButtonState sẽ bằng 1.
- Lúc này thỏa điều kiện newButtonState khác với oldButtonState sẽ làm LED sáng lên vì lúc này pin_switch = 1.
- Và oldButtonState sẽ được cập nhật giá trị là 1.
- Và nếu vẫn còn giữ thì LED sẽ sáng mãi vì lúc này oldButtonState và newButtonState đều bằng 1, không thỏa điều kiện để thay đổi LED, cho tới khi nhả nút nhấn ra.

Sau đây là sản phẩm thực tế:


Kết thúc ví dụ thứ 2, vậy các bạn sẽ hỏi, vậy ở ví dụ 1 và 2 khác nhau ở điểm nào. Ở ví dụ 1 chúng ta cũng nhấn nút và LED sáng, nhã nút nhấn thì LED tắt, ở ví dụ 2 cũng vậy, đâu có khác gì đâu.

Bây giờ chúng ta sẽ thêm 1 vài dòng code vào 2 ví dụ để kiểm nhận sự khác biệt các bạn nhé.
Ta xét ở ví dụ 1, thay đổi code như sau:

int pin_LED = 10;
int pin_switch = 2;
void setup()
{
  Serial.begin(9600);
  pinMode(pin_LED, OUTPUT);
  pinMode(pin_switch, INPUT);
}

void loop()
{
    if(digitalRead(pin_switch)==HIGH){
      digitalWrite(pin_LED, HIGH);
        Serial.println("LED ON");
    }
  else{  
      digitalWrite(pin_LED, LOW); 
      Serial.println("LED OFF");
  }
}

Thêm cấu hình hiển thị Serial Monitor ở baudrate 9600, khi chúng ta nhấn nút thì sẽ gửi qua Serial dòng chữ "LED ON" và nếu không nhấn thì sẽ gửi dòng chữ "LED OFF"



Theo như chúng ta thấy thì khi nhấn hoặc không nhấn thì Lệnh Serial được gửi liên tục, điều này sẽ rất khó để kiểm soát được việc thay đổi trạng thái của nút nhấn để điều khiển 1 bước nào đó. Nên chúng ta thử xét ở ví dụ 2, xem thế nào nhé các bạn.
Ở ví dụ 2, ta sẽ thay đổi code như sau:

int pin_LED = 10;
int pin_switch = 2;
boolean newButtonState = 0;
boolean oldButtonState = 0;
void setup()
{
  Serial.begin(9600);
  pinMode(pin_LED, OUTPUT);
  pinMode(pin_switch, INPUT);
}

void loop()
{
  newButtonState = digitalRead(pin_switch);
  if(newButtonState != oldButtonState){
    if(digitalRead(pin_switch)==HIGH){
      digitalWrite(pin_LED, HIGH);
        Serial.println("LED ON");
    }else{
        digitalWrite(pin_LED, LOW);
        Serial.println("LED OFF");
    }
    oldButtonState = newButtonState;
  }  
}

Chúng ta sẽ xem video để dễ hiểu hơn



Ở video các bạn thấy, khi arduino bắt đầu chạy thì Serial Monitor không hiển thị bất kỳ thứ gì cả, vì đâu có thỏa điều kiện đâu mà chạy, khi mình nhấn nút thì chỉ hiển thị LED ON lên một lần, và khi nhã nút nhấn ra chỉ hiển thị LED OFF một lần.
Điều này chứng tỏ, nếu ta dùng code này khi muốn nhấn thì sẽ tăng giá trị lên 1 chẳng hạn thì sẽ rất tốt. Vì khi nhấn vào thì đoạn code bên trong điều kiện thỏa chỉ được thực hiện 1 lần.

Như vậy chúng ta đã hiểu hơn về cách hoạt động của nút nhấn trong Arduino rồi. Mọi ý kiến hay chia sẽ gì rất mong các bạn để lại phần comment bên dưới các bạn nhé. Mọi ý kiến thắc mắc, các bạn có thể liên hệ qua fb hoặc e-mail của mình nhé, hẹn gặp các bạn ở topic tiếp theo

Thứ Sáu, 5 tháng 7, 2019

Ở phần lập trình arduino này mình sẽ chỉ trình bày sơ đồ giải thuật của đề tài và toàn bộ code, thư viện sử dụng trong đề tài này.

Các kiến thức các bạn cần nắm đẻ lập trình Arduino trong đề tài này:
- Giao tiếp IO, biết cách đọc tín hiệu từ nút nhấn, phân biệt mức 1 - 0. Xuất ngỏ ra output mức 1 - 0.
Tham khảo tại link này nhé.
- Giao tiếp hiển thị chữ trên LCD 16x02, qua board I2C LCD. Tham khảo bài viết ở đây.
- Sử dụng chương trình ngắt timer. Tham khảo ở đây.
- Sử dụng ngắt ngoại (external). Tham khảo ở đây.
- Giao tiếp với module Nhiệt độ, Độ ẩm DHT22. Tham khảo ở đây.

Thứ Năm, 4 tháng 7, 2019

Ở Phần 2 mình sẽ nói khá nhiều về lý thuyết, nhưng mình khuyên các bạn cũng nên bỏ một chút thời gian ra để đọc phần này, như vậy mình sẽ có 1 số kiến thức cơ bản. Mình sẽ viết rất dễ hiểu thôi.

Ở phần 2.1 này mình sẽ nói về lý thuyết điều khiển tự động, vấn đề cốt lõi của đề tài này.

Bài toán đặt ra như thế này: Điều khiển nhiệt độ bên trong thùng xốp kích thước (60cmx60cmx60cm), duy trì ở nhiệt độ 37.5 độ C.
Điều đầu tiên các bạn nghĩ đến là sẽ cấp nguồn cho 1 nguồn nhiệt nào đó để tạo ra một lượng nhiệt cho không gian bên trong thùng xốp đúng ko nào?
Chính xác rồi, vậy vật cấp nhiệt đó có thể là sợi gia nhiệt hoặc bóng đèn sợi đốt.
Ở đây mình lựa chọn là bóng đèn sợi đốt.
Giờ khi chưa bắt tay vào làm và chưa có gì trong tay thì các bạn hãy tưởng tượng theo mình nhé.
Khi bóng đèn sợi đốt được thắp sáng, nhiệt độ sẽ tăng và muốn nhiệt độ giảm thì mình sẽ tắt bóng đèn đi. Để giám sát được nhiệt độ thì chúng ta sẽ dùng cảm biến để theo dõi nhiệt độ (thành phần này trong lý thuyết điều khiển tự động gọi là feedback tạm dịch là phần hồi tiếp).
Tiếp đến khi có tín hiệu feedback bây giờ đến phần điều khiển bóng đèn để có được nhiệt độ 37.5 độ C như yêu cầu của đề bài.
Bước đầu tiên: Khi đọc tín hiệu nhiệt độ trong thùng xốp về nếu < 37.5 sẽ điều khiển ngõ ra cho bóng đèn sáng, đợi 1 thời gian thì nhiệt độ trong thùng xốp sẽ đạt được 37.5 độ C. Lúc này sẽ điều khiển ngõ ra tắt bóng đèn, ngắt nguồn nhiệt. Theo các bạn lúc tại thời điểm ngắt bóng đèn thì nhiệt độ trong thùng xốp có tăng lên nữa không ạ? Hay vừa ngắt nguồn nhiệt là nhiệt độ sẽ giữ ngay tại 37.5 độ C.
Câu trả lời là nhiệt độ sẽ tăng và tăng bao nhiêu là sẽ phụ thuộc vào công suất của bóng đèn và không gian thể tích của thùng xốp. Việc chỉ điều chỉnh On-Off bóng đèn như vậy rất khó để chúng ta điều khiển chính xác được nhiệt độ chúng ta mong muốn. Ở đây mình sẽ nói thêm 1 khái niệm khi bạn On bóng đèn, bóng đèn hoạt động với công suất 100% sẽ cho ta 1 lượng nhiệt, đến 37.5 độ C các bạn ngắt bóng đèn và nhiệt độ vẫn cứ tăng đến 1 nhiệt độ nào đó và khi nhiệt độ đó bắt đầu giảm xuống. Ví dụ như: Khi tắt bóng đèn Nhiệt độ đọc về từ sensor lên đến 39 độ C và bắt đầu giảm thì nhiệt độ 37.5 --> 39 độ C gọi là giá trị vọt lố (cái này cũng là 1 khái niệm trong điều khiển tự động).

Bước 2: Tìm cách giải quyết vấn đề ở trên. Để nhiệt độ duy trì ở nhiệt độ đặt chúng ta sẽ áp dụng lý thuyết điều khiển PID hệ điều khiển kín.


Phân biệt điều khiển vòng kín ở trên theo cách on_off cũng là 1 loại trong số đó và vẫn có phần hồi tiếp để điều khiển on_off. Nhưng ở đây mình muốn điều khiển nhuyễn hơn nên sẽ dùng hàm PID ở bộ Controller ở hình mô tả trên.

Bước 3: Mình đã sử dụng hàm truyền PID vào đề tài này như thế nào?
Ở đây mình sẽ trình bày theo cách mình hiểu và rút ra được từ thực tế mình làm, có thể những câu từ không chính xác như lý thuyết, nhưng theo kết quả mình nhận được thì ít nhất là nó khá ổn cho đề tài này. Lý thuyết điều khiển tự động thì rất bao la, bát ngát. Nên qua phần này mình chỉ muốn giúp các bạn có một cái nhìn thật trực quan về vấn đề tưởng như dễ mà khó, khó mà dễ này.


Ở đề tài này mình chỉ áp dụng hệ PI thôi thì thấy kết quả cũng khá ổn rồi, nên giờ chúng mình bắt đầu nhé.

Lại có thể các bạn phải tưởng tượng một chút nữa rồi.
Theo như hình ở trên thì 
+ giá trị error = giá trị setpoint - giá trị feedback.
+ giá trị error này có thể Dương >0 hoặc Âm <0.
Hàm truyền PI được viết như sau:
PI output = P_value + I_value
trong đó: 
P_value = Kp*error
I_value = I_value + (Ki*error)

Tới đây thì các bạn chắc cũng đã hơi có một chút hoang mang rồi. Nhưng các bạn đã làm tới phần mạch này chưa và dự án của các bạn đã chạy đến đâu rồi. Tạm ngưng lý thuyết ở đây giờ chúng ta sẽ chuyển sang phần lắp ráp phần điều khiển arduino cho đề tài này nhé. Mời các bạn đón xem phần tiếp theo, toàn bộ các kiến thức sử dụng arduino sử dụng trong đề tài này.





Thứ Ba, 2 tháng 7, 2019


Chắc hẳn nếu các bạn tìm đọc đến blog này của mình thì cũng đã từng biết cách điều khiển độ sáng của bóng đèn DC, cách điều khiển bóng đèn 12VDC thì cũng đơn giản hơn đôi chút. Và chúng điều có chung một lý thuyết giống nhau, để bóng đèn sáng mạnh thì cấp 1 mức điện áp bằng điện áp định mức, lúc này ta sẽ được kết quả bóng đèn hoạt động tối ưu tại giá trị thiết lập của nhà sản xuất, hay hiểu nôm na là hoạt động hết công suất của bóng đèn. Ví dụ đơn giản để một bóng đèn 60W - 220VAC (thông số này có ghi trên thân bóng đèn sợi đốt) hoạt động hết công suất tối đa của nó thì chúng ta phải cấp 1 điện áp là 220VAC cho nó.

? Vậy nếu chúng ta cấp 1 điện áp lớn hơn hay nhỏ hơn 220VAC thì điều gì sẽ xảy ra?

Trả lời cho trường hợp thứ nhất: Cấp mức điện áp lớn hơn điện áp định mức của bóng đèn, điều các bạn thấy có thể bóng đèn sẽ sáng hơn và điều tồi tệ hơn là nếu điện áp cấp vượt quá cao so với mức điện áp định mức thì bóng đèn sẽ bị đứt. (cái này thì đọc kỹ tài liệu nhà sản xuất chắc có ghi), thường thì mình thấy nếu đâu đó nếu điện áp tăng lên khoảng 10% thì bóng đèn vẫn có thể chịu được nhưng chắc tuổi thọ sẽ không bằng, bạn có quyền thử nghiệm để xem thực tế như thế nào, thử cấp 1 mức điện áp 240VAC cho bóng đèn xem nó có sáng hơn không hay là tối hơn. Tối hơn chỉ là khi nó đã bị hỏng và xin chia buồn với bạn vì điều đó.

Trả lời cho trường hợp thứ hai: Cấp mức điện ấp thấp hơn điện áp định mức của bóng đèn, bóng đèn sẽ sáng yếu đi và nếu thấp quá thì chúng ta sẽ không thấy bóng đèn sáng nữa.

Ở bài này mình sẽ giới thiệu cách bạn có thể điều chỉnh độ sáng của bóng đèn 220VAC bằng Arduino, nghe có vẻ hấp dẫn nhỉ, chúng ta cùng nhau bắt đầu thôi.

Để giải quyết làm sao để cấp 1 điện áp thay đổi được cho bóng đèn để bóng đèn có thể sáng tối khác nhau.

Ta sẽ thay đổi góc kích hình sine cho bóng đèn, được lái bởi con triac.
Khi góc kích con triac thay đổi sẽ thay đổi thời gian dẫn của bóng đèn, nếu trong 1/2 chu kỳ sine 180 độ triac chỉ được kích dẫn 50% thì điện áp chắc chắn sẽ còn 50%. Đó là ý tưởng của việc thay đổi độ sáng bòng đèn.
Để làm được điều này các bạn cần một mạch nữa là zero dectect circuit. Như hình dưới.

Mính sẽ giải thích nguyên lý của mạch trên như sau:
Đầu tiên điện áp 220VAC từ lưới sẽ được hạ dòng xuống khi qua 2 điện trở 33K 1/2W. Sau đó đi vào mạch cầu. Lúc này mạch cầu của chúng ta sẽ làm cho chu kỳ âm của sóng sine lật ngược lên trên hết.

Sau đó tín hiệu ngỏ ra của mạch cầu diode sẽ được điều khiển bởi 1 con octo cách ly, ngõ ra octo cách ly được định thiên bởi nguồn 5VDC và một trở 10KOhm. Đưa vào chân ngắt ngoại của Arduino để phát hiện điểm zero của sóng sine.

Giải thích luôn nguyên lý thay đổi góc kích cho triac, trong chương trình ngắt ngoại sẽ điều khiển thời gian kích dẫn triac.
Nếu Triac được kích ngay điểm zero có phải ngõ ra tải sẽ dường như đủ 360 độ không ạ?
Giờ muốn giảm thời gian thay đổi góc kích thì ta sẽ cho delay thời gian kích triac lại đúng không ạ?
Bây giờ quay qua tính toán một chút. Điện lưới của chúng ta đang dùng là 50Hz nghĩa là thời gian 1 chu kỳ 20ms 1/2 chu kỳ 10ms.

Ở hình trên đường nét cắt là điện áp 220VAC vào, Đường màu xanh dương là điện áp ra, và đường màu đỏ là điện áp kích từ arduino.
Khoảng thời gian t1 là khoảng thời gian cho G của Triac chưa được kích lúc này ngõ ra VAC sẽ là 0V. Khi ngõ ra G được kích thì sẽ có áp như hình trên, sau một khoảng thời gian t2 chân G sẽ được ngắt, nhưng lúc này triac vẫn dẫn cho đến khi chu kỳ sine tới điểm zero thì triac sẽ tự off, đợi tới chu kỳ kế tiếp kích chân G lên và cứ thế tiếp tục.

Và sau đây là code arduino cho chương trình:


int AC_LOAD = 10;    // Output to Opto Triac pin
int dimming = 0;  // Dimming level (0-128)  0 = ON, 128 = OFF
int count = 0;
int dimtime;
char val;
void setup()
{
  Serial.begin(9600);
  pinMode(AC_LOAD, OUTPUT);// Set AC Load pin as output
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  attachInterrupt(1, zero_crosss_int, FALLING);  // Choose the zero cross interrupt # from the table above pin 2
}

//the interrupt function must take no parameters and return nothing
void zero_crosss_int()  //function to be fired at the zero crossing to dim the light
{
  // Firing angle calculation : 1 full 50Hz wave =1/50=20ms 
  // Every zerocrossing thus: (50Hz)-> 10ms (1/2 Cycle) 
  // For 60Hz => 8.33ms (10.000/120)
  // 10ms=10000us
  // (10000us - 10us) / 128 = 75 (Approx) For 60Hz =>65

  dimtime = (75*dimming);    // For 60Hz =>65    
  delayMicroseconds(dimtime);    // Wait till firing the TRIAC
  digitalWrite(AC_LOAD, HIGH);   // Fire the TRIAC
  delayMicroseconds(10);         // triac On propogation delay (for 60Hz use 8.33)
  digitalWrite(AC_LOAD, LOW);    // Nzzzzzo longer trigger the TRIAC (the next zero crossing will swith it off) TRIAC
  count ++;
  if(count == 100){
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
    count = 0;
  }
}

void loop()  {
    for (int i=0; i <= 115; i++){
      dimming=i;
      delay(500);
      Serial.print(dimming);
      Serial.print("\n");
      Serial.print(dimtime);
      Serial.print("\n");
     }
    if (Serial.available()) 
   { // If data is available to read,
     val = Serial.read(); // read it and store it in val
   }

    if(val == '1') dimming = dimming + 20;
    if(val == '2') dimming = dimming - 20;
}