
开源协议
:CC BY-NC-ND 3.0
(未经作者授权,禁止转载)描述
心心念念的彩色丝印活动终于是赶上了,一直筹划做个仿立创的交通控制电路,但是立创的那个交通系统实在是太迷你了(主要还是技术不够),那就自己动手用现有的知识做一个漂漂亮亮的交通控制拓展,在搜集了相关的交通道理系统,看了很多现实的路口交通,然后就有了下面的过程,先上效果图,
这是立创非常漂亮的交通拓展工程https://oshwhub.com/li-chuang-kai-fa-ban/tian-gang-xing-kuo-zhan-ban

-------------------------------
这是某地交通实拍图:

-------------------------------
这是根据实拍图绘制的平面效果图:

-------------------------
这是结合立创交通扩展板和自己根据实拍图和效果图制作的实物完工图:

------------------------------------------------------------------------------------------------
本着能彩色丝印绝不浪费的理念,以上电路就赶上了这次立创的彩色丝印的活动,不得不说,立创的彩色丝印还原度很高,基本和做的平面效果图分毫不差。
下面再来简单说说电路中的基本电路应用。
开发板选择的是立创自研的esp32s3r8n8,通过对连接东西南北的交通灯,控制来实现道路交通管制,程序是arduino的,
电路中增加了Type-C供电或者是直接开发板供电,增加了一个手动开关,和复位按钮,交通灯东西和南北相交错进行红绿灯转换。
另外增加了一个pc无源喇叭来模拟交通灯变灯声音,
-------------------------------------------------------------------------------
主控制连接电路

type-c供电电路,按键和喇叭电路

不足之处,本来想着再用WiFi功能连接手机去实现物联网功能让手机控制交通灯,时间仓促,所以搁置没有完成,只完成了基本的通电亮灯交替变换的过程,希望以后能继续去完善这个电路。
-------------------------------
以下是部分代码,写的太垃,勿喷。
#include "SevSeg.h"
volatile int RED;
volatile int YELLOW;
volatile int GREED;
volatile int RED2;
volatile int GREED2;
volatile int beep;
volatile int KEY;
volatile int 倒计时数值;
volatile int 倒计时X秒红灯;
volatile int 倒计时闪灯间隔;
volatile int 倒计时闪灯3次;
volatile int 红绿灯时间;
SevSeg sevseg;
hw_timer_t * timer0 =NULL;
void IRAM_ATTR onTimer0() {
sevseg.refreshDisplay();}
hw_timer_t * timer1 =NULL;
void IRAM_ATTR onTimer1() {
ESP.restart();
}
void 数码管() {
for (int i = (红绿灯时间); i >= (0); i = i + (-1)) {
sevseg.setNumber(i,(-1));
delay(1000);
}
for (int i = (倒计时闪灯3次); i >= (0); i = i + (-1)) {
sevseg.setNumber(i,(-1));
delay(1000);
}
}
void 黄灯1() {
for (int i = (倒计时闪灯3次); i >= (0); i = i + (-1)) {
pinMode(YELLOW, OUTPUT);
digitalWrite(YELLOW,HIGH);
delay(倒计时闪灯间隔);
pinMode(YELLOW, OUTPUT);
digitalWrite(YELLOW,LOW);
delay(倒计时闪灯间隔);
}
}
void 黄灯2() {
for (int i = (倒计时闪灯3次); i >= (0); i = i + (-1)) {
delay(倒计时闪灯间隔);
delay(倒计时闪灯间隔);
}
}
void task_1( void * pvParameters ){
for(;;){
数码管();
vTaskDelay(1);
}
}
void 红灯1() {
pinMode(RED, OUTPUT);
digitalWrite(RED,HIGH);
delay((倒计时数值 * 1000));
pinMode(RED, OUTPUT);
digitalWrite(RED,LOW);
for (int i = (倒计时闪灯3次); i >= (0); i = i + (-1)) {
pinMode(RED, OUTPUT);
digitalWrite(RED,HIGH);
delay(倒计时闪灯间隔);
pinMode(RED, OUTPUT);
digitalWrite(RED,LOW);
delay(倒计时闪灯间隔);
}
}
void 绿灯1() {
pinMode(GREED, OUTPUT);
digitalWrite(GREED,HIGH);
delay((倒计时数值 * 1000));
pinMode(GREED, OUTPUT);
digitalWrite(GREED,LOW);
for (int i = (倒计时闪灯3次); i >= (0); i = i + (-1)) {
pinMode(GREED, OUTPUT);
digitalWrite(GREED,HIGH);
delay(倒计时闪灯间隔);
pinMode(GREED, OUTPUT);
digitalWrite(GREED,LOW);
delay(倒计时闪灯间隔);
}
}
void beep2() {
pinMode(beep, OUTPUT);
digitalWrite(beep,HIGH);
delay(50);
pinMode(beep, OUTPUT);
digitalWrite(beep,LOW);
delay(50);
}
void task_2( void * pvParameters ){
for(;;){
红灯1();
黄灯1();
绿灯1();
黄灯1();
vTaskDelay(1);
}
}
void task_3( void * pvParameters ){
for(;;){
绿灯2();
黄灯2();
红灯2();
黄灯2();
vTaskDelay(1);
}
}
void 红灯2() {
pinMode(RED2, OUTPUT);
digitalWrite(RED2,HIGH);
delay((倒计时数值 * 1000));
pinMode(RED2, OUTPUT);
digitalWrite(RED2,LOW);
for (int i = (倒计时闪灯3次); i >= (0); i = i + (-1)) {
pinMode(RED2, OUTPUT);
digitalWrite(RED2,HIGH);
delay(倒计时闪灯间隔);
pinMode(RED2, OUTPUT);
digitalWrite(RED2,LOW);
delay(倒计时闪灯间隔);
}
}
void 绿灯2() {
pinMode(GREED2, OUTPUT);
digitalWrite(GREED2,HIGH);
delay((倒计时数值 * 1000));
pinMode(GREED2, OUTPUT);
digitalWrite(GREED2,LOW);
for (int i = (倒计时闪灯3次); i >= (0); i = i + (-1)) {
pinMode(GREED2, OUTPUT);
digitalWrite(GREED2,HIGH);
delay(倒计时闪灯间隔);
pinMode(GREED2, OUTPUT);
digitalWrite(GREED2,LOW);
delay(倒计时闪灯间隔);
}
}
void task_4( void * pvParameters ){
for(;;){
delay((倒计时数值 * 1000));
for (int i = 1; i >= 0; i = i + (-1)) {
for (int i = (倒计时闪灯3次); i >= (0); i = i + (-1)) {
beep2();
delay((1000 - 100));
}
}
vTaskDelay(1);
}
}
void setup(){
timer0=timerBegin(0, 80, true);
timerAttachInterrupt(timer0, &onTimer0, true);
timerAlarmWrite(timer0, 1000, true);
timer1=timerBegin(1, 80, true);
timerAttachInterrupt(timer1, &onTimer1, true);
timerAlarmWrite(timer1, 1793000000, false);
Serial.begin(9600);
byte numDigits =2;
byte segmentPins[] ={3,4,5,6,7,8,9,10};
byte digitPins[] = {2,1};
bool resistorsOnSegments = false;
byte hardwareConfig =COMMON_CATHODE;
bool updateWithDelays = false;
bool leadingZeros = false;
bool disableDecPoint = false;
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments, updateWithDelays, leadingZeros, disableDecPoint);
RED = 18;
YELLOW = 17;
GREED = 16;
RED2 = 41;
GREED2 = 15;
beep = 21;
KEY = 40;
倒计时数值 = 27;
倒计时X秒红灯 = 0;
倒计时闪灯间隔 = 500;
倒计时闪灯3次 = 3;
红绿灯时间 = 倒计时数值 + 倒计时闪灯3次;
//数码管定义:这里是开发版上引脚对应的数码管的
//dig1, dig2
//2=8, 1=7共地
//a, b, c, d, e, f, g, dp
//3=10, 4=9, 5=1, 6=4, 7=3, 8=6, 9=5, 10=2
sevseg.setBrightness(90);timerAlarmEnable(timer0);
//数码管定义结束
Serial.flush();
//下面是led,数码管及按键引脚定义
pinMode(KEY, INPUT_PULLUP);
pinMode(RED, OUTPUT);
digitalWrite(RED,LOW);
pinMode(YELLOW, OUTPUT);
digitalWrite(YELLOW,LOW);
pinMode(GREED, OUTPUT);
digitalWrite(GREED,LOW);
pinMode(RED2, OUTPUT);
digitalWrite(RED2,LOW);
pinMode(GREED2, OUTPUT);
digitalWrite(GREED2,LOW);
pinMode(beep, OUTPUT);
digitalWrite(beep,LOW);
//---------------------------------------------
timerAlarmEnable(timer0);
xTaskCreatePinnedToCore(task_1, "task_1", 2048, NULL, 2, NULL, 1);
pinMode(RED, OUTPUT);
digitalWrite(RED,LOW);
pinMode(YELLOW, OUTPUT);
digitalWrite(YELLOW,LOW);
pinMode(GREED, OUTPUT);
digitalWrite(GREED,LOW);
pinMode(RED2, OUTPUT);
digitalWrite(RED2,LOW);
pinMode(GREED2, OUTPUT);
digitalWrite(GREED2,LOW);
pinMode(beep, OUTPUT);
digitalWrite(beep,LOW);
xTaskCreatePinnedToCore(task_2, "task_2", 2048, NULL, 2, NULL, 0);
pinMode(RED, OUTPUT);
digitalWrite(RED,LOW);
pinMode(YELLOW, OUTPUT);
digitalWrite(YELLOW,LOW);
pinMode(GREED, OUTPUT);
digitalWrite(GREED,LOW);
pinMode(RED2, OUTPUT);
digitalWrite(RED2,LOW);
pinMode(GREED2, OUTPUT);
digitalWrite(GREED2,LOW);
pinMode(beep, OUTPUT);
digitalWrite(beep,LOW);
xTaskCreatePinnedToCore(task_3, "task_3", 2048, NULL, 2, NULL, 0);
xTaskCreatePinnedToCore(task_4, "task_4", 2048, NULL, 2, NULL, 0);
}
void loop(){
vTaskDelay(1);
Serial.println(String("系统运行时间") + String(String((((int)(millis())) / 1000)).toInt()) + String("秒"));
vTaskDelay(1);
vTaskDelay(1);
vTaskDelay(1);
}
设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。









